Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package pt.ipleiria.estg.dei.aed.modelo.contactos;
- import pt.ipleiria.estg.dei.aed.colecoes.iteraveis.IteradorIteravelDuplo;
- import pt.ipleiria.estg.dei.aed.colecoes.iteraveis.associativas.estruturas.TabelaHashPorSondagemComIncrementoQuadratico;
- import pt.ipleiria.estg.dei.aed.colecoes.iteraveis.lineares.ordenadas.estruturas.ListaDuplaCircularBaseLimiteOrdenada;
- import pt.ipleiria.estg.dei.aed.colecoes.iteraveis.lineares.ordenadas.estruturas.ListaDuplaCircularBaseLimiteOrdenadaDistinta;
- import pt.ipleiria.estg.dei.aed.modelo.Contacto;
- import pt.ipleiria.estg.dei.aed.modelo.Data;
- import pt.ipleiria.estg.dei.aed.modelo.contactos.comparadores.ComparacaoContactosPorPrimeiroNomeAscSeguidoPorUltimoNomeAsc;
- import pt.ipleiria.estg.dei.aed.modelo.contactos.comparadores.ComparacaoLimiteDataAsc;
- import java.util.List;
- import java.util.NoSuchElementException;
- public enum GestorContactosOtimizado {
- INSTANCIA;
- private ListaDuplaCircularBaseLimiteOrdenadaDistinta<Data> datas;
- private IteradorIteravelDuplo<Contacto> ITERADOR_CONTACTOS_VAZIO = new ListaDuplaCircularBaseLimiteOrdenada<>(
- ComparacaoContactosPorPrimeiroNomeAscSeguidoPorUltimoNomeAsc.CRITERIO).iterador();
- private TabelaHashPorSondagemComIncrementoQuadratico<Data, ContactosNascidosNumaData> contactosPorData;
- GestorContactosOtimizado() {
- datas = new ListaDuplaCircularBaseLimiteOrdenadaDistinta<>(ComparacaoLimiteDataAsc.CRITERIO);
- contactosPorData = new TabelaHashPorSondagemComIncrementoQuadratico<>(100);
- }
- public void inserir(Contacto contacto){
- ContactosNascidosNumaData existente = contactosPorData.consultar(contacto.getDataNascimento());
- if (existente==null){
- existente = new ContactosNascidosNumaData(contacto.getDataNascimento());
- contactosPorData.inserir(contacto.getDataNascimento(), existente);
- datas.inserir(contacto.getDataNascimento());
- }
- existente.inserir(contacto);
- }
- public Contacto remover(Contacto contacto){
- ContactosNascidosNumaData existente = contactosPorData.consultar(contacto.getDataNascimento());
- if (existente == null){
- return null;
- }
- Contacto removido = existente.removerContacto(contacto);
- if (removido!=null && existente.isVazia()){
- contactosPorData.remover(contacto.getDataNascimento());
- datas.remover(contacto.getDataNascimento());
- }
- return removido;
- }
- public IteradorIteravelDuplo<Contacto> remover(Data data){
- ContactosNascidosNumaData existente = contactosPorData.consultar(data);
- if (existente != null){
- return ITERADOR_CONTACTOS_VAZIO;
- }
- contactosPorData.remover(data);
- datas.remover(data);
- return existente.iterador();
- }
- public IteradorIteravelDuplo<Contacto> consultar(Data data){
- ContactosNascidosNumaData existente = contactosPorData.consultar(data);
- if (existente != null){
- return ITERADOR_CONTACTOS_VAZIO;
- }
- return existente.iterador();
- }
- public IteradorIteravelDuplo<Contacto> consultar(Data inicio, Data fim){
- return new Iterador(inicio, fim);
- }
- public class Iterador implements IteradorIteravelDuplo<Contacto>{
- private IteradorIteravelDuplo<Data> iteradorDatas;
- private IteradorIteravelDuplo<Contacto> iteradorContactos;
- public Iterador(Data inicio, Data fim) {
- iteradorDatas = datas.consultar(inicio, fim);
- iteradorContactos = ITERADOR_CONTACTOS_VAZIO;
- }
- @Override
- public boolean podeRecuar() {
- return iteradorContactos.podeRecuar() || iteradorDatas.podeRecuar();
- }
- @Override
- public Contacto recuar() {
- if (!iteradorContactos.podeRecuar()){
- Data anterior = iteradorDatas.recuar();
- iteradorContactos = contactosPorData.consultar(anterior).iterador();
- }
- return iteradorContactos.recuar();
- }
- @Override
- public void reiniciar() {
- iteradorDatas.reiniciar();
- iteradorContactos = ITERADOR_CONTACTOS_VAZIO;
- }
- @Override
- public Contacto corrente() {
- return iteradorContactos.corrente();
- }
- @Override
- public boolean podeAvancar() {
- return iteradorContactos.podeAvancar() || iteradorDatas.podeAvancar();
- }
- @Override
- public Contacto avancar() {
- if (!iteradorContactos.podeAvancar()){
- Data seguinte = iteradorDatas.avancar();
- iteradorContactos = contactosPorData.consultar(seguinte).iterador();
- }
- return iteradorContactos.avancar();
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement