Advertisement
Guest User

Untitled

a guest
Dec 19th, 2018
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.77 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.TabelaHashPorSondagem;
  5. import pt.ipleiria.estg.dei.aed.colecoes.iteraveis.associativas.estruturas.TabelaHashPorSondagemComIncrementoQuadratico;
  6. import pt.ipleiria.estg.dei.aed.colecoes.iteraveis.lineares.naoordenadas.estruturas.ListaDuplaNaoOrdenada;
  7. import pt.ipleiria.estg.dei.aed.colecoes.iteraveis.lineares.ordenadas.estruturas.ListaDuplaCircularBaseLimiteOrdenadaDistinta;
  8. import pt.ipleiria.estg.dei.aed.modelo.contactos.comparadores.ComparacaoLimiteDatasAscendente;
  9.  
  10. public enum GestorContactosOtimizado {
  11. INSTANCIA;
  12.  
  13. private static final IteradorIteravelDuplo<Contacto> ITERADOR_DUPLO_VAZIO = new ListaDuplaNaoOrdenada<Contacto>().iterador();
  14. private TabelaHashPorSondagem<Data, GestorDataContactos> contactosPorData; //utilizamos gestor pq ele ja tem a lista
  15. private ListaDuplaCircularBaseLimiteOrdenadaDistinta<Data> datas;
  16. private TabelaHashPorSondagem<Long, Contacto> tabelaContactosNumeroTelefone;
  17.  
  18. GestorContactosOtimizado() {
  19. contactosPorData = new TabelaHashPorSondagemComIncrementoQuadratico<>(100);
  20. datas = new ListaDuplaCircularBaseLimiteOrdenadaDistinta<>(ComparacaoLimiteDatasAscendente.CRITERIO);
  21. tabelaContactosNumeroTelefone = new TabelaHashPorSondagemComIncrementoQuadratico<>(100);
  22. }
  23.  
  24. public void inserir(Contacto contacto) {
  25. tabelaContactosNumeroTelefone.inserir(contacto.getNumeroTelefone(), contacto);
  26.  
  27.  
  28. Data dataNascimento = contacto.getDataNascimento();
  29. GestorDataContactos contactosNaData = contactosPorData.consultar(dataNascimento);
  30. if (contactosNaData == null) {
  31. contactosNaData = new GestorDataContactos(dataNascimento);
  32. contactosPorData.inserir(dataNascimento, contactosNaData);
  33. datas.inserir(dataNascimento);
  34. }
  35.  
  36. contactosNaData.inserir(contacto);
  37. }
  38.  
  39. public Contacto remover(Contacto contactoARemover) {
  40. long numeroTelefone = contactoARemover.getNumeroTelefone();
  41. Contacto contacto = tabelaContactosNumeroTelefone.consultar(numeroTelefone);
  42.  
  43. //null.equals(contactoARemover) -- nullpointerexeption
  44. if (!contactoARemover.equals(contacto)) {
  45. return null;
  46. }
  47.  
  48. Contacto contactoRemovido = tabelaContactosNumeroTelefone.remover(numeroTelefone);
  49.  
  50. removerDosContactosNaData(contactoRemovido);
  51.  
  52. return contactoRemovido;
  53. }
  54.  
  55. public IteradorIteravelDuplo<Contacto> remover(Data dataNascimento) {
  56. GestorDataContactos contactosNaData = contactosPorData.remover(dataNascimento);
  57.  
  58. if (contactosNaData == null) {
  59. return ITERADOR_DUPLO_VAZIO;
  60. }
  61.  
  62. datas.remover(dataNascimento);
  63.  
  64. IteradorIteravelDuplo<Contacto> iterador = contactosNaData.iteradorContactos();
  65. /*while (iterador.podeAvancar()){
  66. Contacto contacto = iterador.avancar();
  67. tabelaContactosNumeroTelefone.remover(contacto.getNumeroTelefone());
  68. }*/
  69. for (Contacto contacto : iterador) {
  70. tabelaContactosNumeroTelefone.remover(contacto.getNumeroTelefone());
  71. }
  72. iterador.reiniciar(); //para nao devolver o iterador ja no fim
  73. return iterador;
  74. }
  75.  
  76. public Contacto remover(long numeroTelefone) {
  77. Contacto contactoRemovido = tabelaContactosNumeroTelefone.remover(numeroTelefone);
  78. if (contactoRemovido == null) {
  79. return null;
  80. }
  81.  
  82. removerDosContactosNaData(contactoRemovido);
  83.  
  84. return contactoRemovido;
  85. }
  86.  
  87. public void removerDosContactosNaData(Contacto contactoRemovido) {
  88. Data dataNascimento = contactoRemovido.getDataNascimento();
  89.  
  90. GestorDataContactos contactosNaData = contactosPorData.consultar(dataNascimento);
  91.  
  92. contactosNaData.remover(contactoRemovido);
  93.  
  94. if (contactosNaData.isVazio()) {
  95. contactosPorData.remover(dataNascimento);
  96. datas.remover(dataNascimento);
  97. }
  98. }
  99.  
  100. public IteradorIteravelDuplo<Contacto> consultar(Data dataNascimento) {
  101. GestorDataContactos contactosNaData = contactosPorData.consultar(dataNascimento);
  102.  
  103. if (contactosNaData == null) {
  104. return ITERADOR_DUPLO_VAZIO;
  105. }
  106. return contactosNaData.iteradorContactos();
  107. }
  108.  
  109. public Contacto consultar(long numeroTelefone) {
  110. return tabelaContactosNumeroTelefone.consultar(numeroTelefone);
  111. }
  112.  
  113. public IteradorIteravelDuplo<Contacto> consultar(Data dataNascimentoInicio, Data dataNascimentoFim) {
  114. return new Iterador(dataNascimentoInicio, dataNascimentoFim);
  115. }
  116.  
  117. private class Iterador implements IteradorIteravelDuplo<Contacto> {
  118.  
  119. private IteradorIteravelDuplo<Data> iteradorDatas;
  120. private IteradorIteravelDuplo<Contacto> iteradorContactos;
  121.  
  122. public Iterador(Data dataNascimentoInicio, Data dataNascimentoFim) {
  123. iteradorDatas = datas.consultar(dataNascimentoInicio, dataNascimentoFim);
  124. iteradorContactos = ITERADOR_DUPLO_VAZIO;
  125. }
  126.  
  127. @Override
  128. public boolean podeRecuar() {
  129. return false;
  130. }
  131.  
  132. @Override
  133. public Contacto recuar() {
  134. if (!iteradorContactos.podeRecuar()) {
  135. //Data proximaData = iteradorDatas.avancar();
  136. //GestorDataContactos contactosNaData = contactosPorData.consultar(proximaData);
  137. //iteradorContactos = contactosNaData.iteradorContactos();
  138. iteradorContactos = contactosPorData.consultar(iteradorDatas.recuar()).iteradorContactos();
  139. }
  140. return iteradorContactos.recuar();
  141. }
  142.  
  143. @Override
  144. public void reiniciar() {
  145. iteradorDatas.reiniciar();
  146. iteradorContactos = ITERADOR_DUPLO_VAZIO;
  147. }
  148.  
  149. @Override
  150. public Contacto corrente() {
  151. return iteradorContactos.corrente();
  152. }
  153.  
  154. @Override
  155. public boolean podeAvancar() {
  156. return iteradorContactos.podeAvancar() || iteradorDatas.podeAvancar();
  157. }
  158.  
  159. @Override
  160. public Contacto avancar() {
  161. if (!iteradorContactos.podeAvancar()) {
  162. //Data proximaData = iteradorDatas.avancar();
  163. //GestorDataContactos contactosNaData = contactosPorData.consultar(proximaData);
  164. //iteradorContactos = contactosNaData.iteradorContactos();
  165. iteradorContactos = contactosPorData.consultar(iteradorDatas.avancar()).iteradorContactos();
  166. }
  167. return iteradorContactos.avancar();
  168. }
  169. }
  170. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement