Advertisement
Guest User

Untitled

a guest
Dec 18th, 2018
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 10.61 KB | None | 0 0
  1. package pt.ipleiria.estg.dei.aed.modelo.contactos;
  2.  
  3. import pt.ipleiria.estg.dei.aed.colecoes.iteraveis.IteradorIteravelDuplo;
  4. import pt.ipleiria.estg.dei.aed.colecoes.iteraveis.associativas.estruturas.TabelaHashPorSondagemComIncrementoPorHash;
  5. import pt.ipleiria.estg.dei.aed.colecoes.iteraveis.associativas.estruturas.TabelaHashPorSondagemComIncrementoQuadratico;
  6. import pt.ipleiria.estg.dei.aed.colecoes.iteraveis.lineares.ordenadas.estruturas.ListaDuplaCircularBaseLimiteOrdenada;
  7. import pt.ipleiria.estg.dei.aed.colecoes.iteraveis.lineares.ordenadas.estruturas.ListaDuplaCircularBaseLimiteOrdenadaDistinta;
  8. import pt.ipleiria.estg.dei.aed.modelo.contactos.Comparadores.ComparacaoLimiteContactosPorPrimeiroNomeAscendenteSeguidoPorUltimoNomeAscendente;
  9. import pt.ipleiria.estg.dei.aed.modelo.contactos.Comparadores.ComparacaoLimiteDatasAscendente;
  10. import pt.ipleiria.estg.dei.aed.modelo.pessoas.hashings.HashingIncremento;
  11.  
  12. public enum GestorContactosOtimizado {
  13.     INSTANCIA;
  14.  
  15.     public static final IteradorIteravelDuplo<Contacto> ITERADOR_VAZIO = new ListaDuplaCircularBaseLimiteOrdenada<>(ComparacaoLimiteContactosPorPrimeiroNomeAscendenteSeguidoPorUltimoNomeAscendente.CRITERIO).iterador();
  16.     private TabelaHashPorSondagemComIncrementoQuadratico<Data, GestorContactosNumaData> contactosPorDataNascimento;
  17.  
  18.     private ListaDuplaCircularBaseLimiteOrdenadaDistinta<Data> datasNascimento;
  19.     private TabelaHashPorSondagemComIncrementoQuadratico<Long, Contacto> contactosPorNumeroTelefone;
  20.  
  21.     GestorContactosOtimizado(){
  22.         contactosPorDataNascimento = new TabelaHashPorSondagemComIncrementoQuadratico<>(20);
  23.         datasNascimento = new ListaDuplaCircularBaseLimiteOrdenadaDistinta<>(ComparacaoLimiteDatasAscendente.CRITERIO);
  24.         contactosPorNumeroTelefone = new TabelaHashPorSondagemComIncrementoQuadratico<>(20);
  25.     }
  26.  
  27.     public void inserir(Contacto contacto){
  28.         //ficha 7
  29.         contactosPorNumeroTelefone.inserir(contacto.getNumeroTelefone(), contacto);
  30.         //obter o gestor de contactos que nasceram na mesma data
  31.         Data dataNascimento = contacto.getDataNascimento();
  32.         GestorContactosNumaData contactosNaDataNascimento = contactosPorDataNascimento.consultar(dataNascimento);
  33.         //se gestor nao existir
  34.         if(contactosNaDataNascimento == null){
  35.             //criar a gestor
  36.             contactosNaDataNascimento = new GestorContactosNumaData();
  37.             //inserir a gestor na tabela de hash
  38.             contactosPorDataNascimento.inserir(dataNascimento, contactosNaDataNascimento);
  39.             //inserir a data no gestor de datas
  40.             datasNascimento.inserir(dataNascimento);
  41.         }
  42.         //inserir o contacto no gestor de contactos respetivo
  43.         contactosNaDataNascimento.inserir(contacto);
  44.     }
  45.  
  46.     public Contacto remover(Contacto contactoARemover){
  47.         //ficha7
  48.         long numeroTelefone;
  49.         if(contactoARemover == null || !contactoARemover.equals(contactosPorNumeroTelefone.consultar(numeroTelefone = contactoARemover.getNumeroTelefone()))){
  50.             return null;
  51.         }
  52.         contactosPorNumeroTelefone.remover(numeroTelefone);
  53.         //////////////////////////////////////////////////////////////////////////////////////
  54.       /*  Data dataNascimento = contactoARemover.getDataNascimento();
  55.         //obter a lista de contactos que nasceram na mesma data de nascimento
  56.         ListaDuplaCircularBaseLimiteOrdenada<Contacto> contactosNaDataNascimento = contactosPorDataNascimento.consultar(dataNascimento);
  57.         //se a lista nao existir
  58.        // if(contactosNaDataNascimento == null){
  59.             //nao ha nada para remover e devolve null
  60.         //    return null;
  61.         //}
  62.         Contacto contactoRemovido = contactosPorNumeroTelefone.remover(numeroTelefone);
  63.         //vereficar se a lista ficou vazia
  64.         if(contactosNaDataNascimento.isVazia()){
  65.             //remover a lista da tabela de hash
  66.             contactosPorDataNascimento.remover(dataNascimento);
  67.             //remover a data da lista de datas
  68.             datasNascimento.remover(dataNascimento);
  69.         }
  70.         //devolver o contacto que efetivamente foi removido*/
  71.         return removerDosContactosPorDataNascimento(contactoARemover);
  72.     }
  73.  
  74.     public IteradorIteravelDuplo<Contacto> remover(Data dataNascimento){ //podem ser varios
  75.         //remover a lista com todos os contactos que nasceram nesse data
  76.         //se esssa lista for nula
  77.         //devolver iterador vazio
  78.         //caso contrario
  79.         //remover a data da lista das datas de nascimento
  80.         //devolver o iterador da lista
  81.         ListaDuplaCircularBaseLimiteOrdenada<Contacto> contactosNaDataNascimento;
  82.         if(dataNascimento == null || (contactosNaDataNascimento = contactosPorDataNascimento.remover(dataNascimento)) == null){
  83.             return ITERADOR_VAZIO;
  84.         }
  85.         datasNascimento.remover(dataNascimento);
  86.         //ficha 7
  87.         for (Contacto contacto : contactosNaDataNascimento) {
  88.             contactosPorNumeroTelefone.remover(contacto.getNumeroTelefone());
  89.  
  90.         }
  91.         return contactosNaDataNascimento.iterador();
  92.     }
  93.  
  94.     public Contacto remover(long numeroTelefone){
  95.         Contacto contactoRemovido = contactosPorNumeroTelefone.remover(numeroTelefone);
  96.         if( contactoRemovido == null){
  97.             return null;
  98.         }
  99.  
  100.  /*       Data dataNascimento = contactoRemovido.getDataNascimento();
  101.         //obter a lista de contactos que nasceram na mesma data de nascimento
  102.         ListaDuplaCircularBaseLimiteOrdenada<Contacto> contactosNaDataNascimento = contactosPorDataNascimento.consultar(dataNascimento);
  103.  
  104.         contactosNaDataNascimento.remover(contactoRemovido);
  105.  
  106.         //vereficar se a lista ficou vazia
  107.         if(contactosNaDataNascimento.isVazia()){
  108.             //remover a lista da tabela de hash
  109.             contactosPorDataNascimento.remover(dataNascimento);
  110.             //remover a data da lista de datas
  111.             datasNascimento.remover(dataNascimento);
  112.         }
  113.         //devolver o contacto que efetivamente foi removido
  114.         return contactoRemovido;*/
  115.  
  116.         //devolver o contacto que egitaivamneet foi removido
  117.         return removerDosContactosPorDataNascimento(contactoRemovido);
  118.  
  119.     }
  120.     private Contacto removerDosContactosPorDataNascimento(Contacto contacto){
  121.         Data dataNascimento = contacto.getDataNascimento();
  122.         //obter a lista de contactos que nasceram na mesma data de nascimento
  123.         ListaDuplaCircularBaseLimiteOrdenada<Contacto> contactosNaDataNascimento = contactosPorDataNascimento.consultar(dataNascimento);
  124.  
  125.         //remover o contacto da lista(visyo que a lista nao esta vazia)
  126.         Contacto contatactoRemovido = contactosNaDataNascimento.remover(contacto);
  127.  
  128.         //vereficar se a lista ficou vazia
  129.         if(contactosNaDataNascimento.isVazia()){
  130.             //remover a lista da tabela de hash
  131.             contactosPorDataNascimento.remover(dataNascimento);
  132.             //remover a data da lista de datas
  133.             datasNascimento.remover(dataNascimento);
  134.         }
  135.         //devolver o contacto que efetivamente foi removido
  136.         return contatactoRemovido;
  137.  
  138.     }
  139.  
  140.     public IteradorIteravelDuplo<Contacto> consultar(Data dataNascimento){
  141.         //obter a lista de contactos que nasceram nessa data
  142.         //se ess alisra nao existir
  143.             //devolver o iterador de uma lista vazia
  144.         //senao, devolver o iterador da lista
  145.         ListaDuplaCircularBaseLimiteOrdenada<Contacto> contactosNaDataNascimento = contactosPorDataNascimento.consultar(dataNascimento);
  146.         return contactosNaDataNascimento != null ? contactosNaDataNascimento.iterador() : ITERADOR_VAZIO;
  147.     }
  148.  
  149.     public IteradorIteravelDuplo<Contacto> consultar(Data dataNascimentoInicio, Data dataNascimentoFim){
  150.         return new Iterador(dataNascimentoInicio, dataNascimentoFim);
  151.     }
  152.  
  153.     private class Iterador implements IteradorIteravelDuplo<Contacto>{
  154.         IteradorIteravelDuplo<Data> iteradorDatasNascimento;
  155.         IteradorIteravelDuplo<Contacto> iteradorContactos;
  156.  
  157.         public Iterador(Data dataNascimentoInicio, Data dataNascimentoFim) {
  158.             iteradorDatasNascimento = datasNascimento.consultar(dataNascimentoInicio,dataNascimentoFim);
  159.             reiniciar();
  160.         }
  161.  
  162.         @Override
  163.         public boolean podeRecuar() {
  164.             return iteradorContactos.podeAvancar() || iteradorDatasNascimento.podeRecuar();
  165.         }
  166.  
  167.         @Override
  168.         public Contacto recuar() {
  169.             if(!iteradorContactos.podeRecuar()){
  170.                 iteradorContactos = contactosPorDataNascimento.consultar(iteradorDatasNascimento.recuar()).iterador();
  171.             }
  172.             return iteradorContactos.recuar();
  173.         }
  174.  
  175.  
  176.         @Override
  177.         public void reiniciar() {
  178.             iteradorDatasNascimento.reiniciar();
  179.             iteradorContactos = ITERADOR_VAZIO;
  180.  
  181.         }
  182.  
  183.         @Override
  184.         public Contacto corrente() {
  185.             return iteradorContactos.corrente();
  186.         }
  187.  
  188.         @Override
  189.         public boolean podeAvancar() {
  190.             return iteradorContactos.podeAvancar() || iteradorDatasNascimento.podeAvancar();
  191.         }
  192.  
  193.         @Override
  194.         public Contacto avancar() {
  195.             if(!iteradorContactos.podeAvancar()){
  196.                 iteradorContactos = contactosPorDataNascimento.consultar(iteradorDatasNascimento.avancar()).iterador();
  197.             }
  198.             return iteradorContactos.avancar();
  199.         }
  200.     }
  201.  
  202.     private class GestorContactosNumaData {
  203.         private ListaDuplaCircularBaseLimiteOrdenada<Contacto> contactos;
  204.         private TabelaHashPorSondagemComIncrementoQuadratico<String, ListaDuplaCircularBaseLimiteOrdenada<Contacto>> contactosPorMorada;
  205.  
  206.         public GestorContactosNumaData() {
  207.             contactos = new ListaDuplaCircularBaseLimiteOrdenada<>(ComparacaoLimiteContactosPorPrimeiroNomeAscendenteSeguidoPorUltimoNomeAscendente.CRITERIO);
  208.             contactosPorMorada = new TabelaHashPorSondagemComIncrementoQuadratico<>(20);
  209.         }
  210.  
  211.         public void inserir(Contacto contacto) {
  212.             contactos.inserir(contacto);
  213.             String morada = contacto.getMorada();
  214.             ListaDuplaCircularBaseLimiteOrdenada<Contacto> contactosNaMorada = contactosPorMorada.consultar(morada);
  215.             if(contactosNaMorada == null){
  216.                 contactosNaMorada = new ListaDuplaCircularBaseLimiteOrdenada<>(ComparacaoLimiteContactosPorPrimeiroNomeAscendenteSeguidoPorUltimoNomeAscendente.CRITERIO);
  217.                 contactosPorMorada.inserir(morada, contactosNaMorada);
  218.             }
  219.             contactosNaMorada.inserir(contacto);
  220.         }
  221.     }
  222. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement