Advertisement
Guest User

Untitled

a guest
Dec 18th, 2018
51
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.84 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.TabelaHashPorSondagemComIncrementoQuadratico;
  5. import pt.ipleiria.estg.dei.aed.colecoes.iteraveis.lineares.ordenadas.estruturas.ListaDuplaCircularBaseLimiteOrdenada;
  6. import pt.ipleiria.estg.dei.aed.colecoes.iteraveis.lineares.ordenadas.estruturas.ListaDuplaCircularBaseLimiteOrdenadaDistinta;
  7. import pt.ipleiria.estg.dei.aed.modelo.Contacto;
  8. import pt.ipleiria.estg.dei.aed.modelo.Data;
  9. import pt.ipleiria.estg.dei.aed.modelo.contactos.comparadores.ComparacaoContactosPorPrimeiroNomeAscSeguidoPorUltimoNomeAsc;
  10. import pt.ipleiria.estg.dei.aed.modelo.contactos.comparadores.ComparacaoLimiteDataAsc;
  11.  
  12. import java.util.List;
  13. import java.util.NoSuchElementException;
  14.  
  15. public enum GestorContactosOtimizado {
  16. INSTANCIA;
  17.  
  18. private ListaDuplaCircularBaseLimiteOrdenadaDistinta<Data> datas;
  19. private IteradorIteravelDuplo<Contacto> ITERADOR_CONTACTOS_VAZIO = new ListaDuplaCircularBaseLimiteOrdenada<>(
  20. ComparacaoContactosPorPrimeiroNomeAscSeguidoPorUltimoNomeAsc.CRITERIO).iterador();
  21. private TabelaHashPorSondagemComIncrementoQuadratico<Data, ContactosNascidosNumaData> contactosPorData;
  22.  
  23. GestorContactosOtimizado() {
  24. datas = new ListaDuplaCircularBaseLimiteOrdenadaDistinta<>(ComparacaoLimiteDataAsc.CRITERIO);
  25. contactosPorData = new TabelaHashPorSondagemComIncrementoQuadratico<>(100);
  26. }
  27.  
  28. public void inserir(Contacto contacto){
  29. ContactosNascidosNumaData existente = contactosPorData.consultar(contacto.getDataNascimento());
  30. if (existente==null){
  31. existente = new ContactosNascidosNumaData(contacto.getDataNascimento());
  32. contactosPorData.inserir(contacto.getDataNascimento(), existente);
  33. datas.inserir(contacto.getDataNascimento());
  34. }
  35. existente.inserir(contacto);
  36. }
  37. public Contacto remover(Contacto contacto){
  38. ContactosNascidosNumaData existente = contactosPorData.consultar(contacto.getDataNascimento());
  39. if (existente == null){
  40. return null;
  41. }
  42. Contacto removido = existente.removerContacto(contacto);
  43.  
  44. if (removido!=null && existente.isVazia()){
  45. contactosPorData.remover(contacto.getDataNascimento());
  46. datas.remover(contacto.getDataNascimento());
  47. }
  48.  
  49. return removido;
  50.  
  51. }
  52.  
  53. public IteradorIteravelDuplo<Contacto> remover(Data data){
  54. ContactosNascidosNumaData existente = contactosPorData.consultar(data);
  55. if (existente != null){
  56. return ITERADOR_CONTACTOS_VAZIO;
  57. }
  58. contactosPorData.remover(data);
  59. datas.remover(data);
  60. return existente.iterador();
  61. }
  62.  
  63. public IteradorIteravelDuplo<Contacto> consultar(Data data){
  64. ContactosNascidosNumaData existente = contactosPorData.consultar(data);
  65. if (existente != null){
  66. return ITERADOR_CONTACTOS_VAZIO;
  67. }
  68. return existente.iterador();
  69. }
  70.  
  71. public IteradorIteravelDuplo<Contacto> consultar(Data inicio, Data fim){
  72. return new Iterador(inicio, fim);
  73. }
  74.  
  75. public class Iterador implements IteradorIteravelDuplo<Contacto>{
  76. private IteradorIteravelDuplo<Data> iteradorDatas;
  77. private IteradorIteravelDuplo<Contacto> iteradorContactos;
  78.  
  79. public Iterador(Data inicio, Data fim) {
  80. iteradorDatas = datas.consultar(inicio, fim);
  81. iteradorContactos = ITERADOR_CONTACTOS_VAZIO;
  82. }
  83.  
  84. @Override
  85. public boolean podeRecuar() {
  86. return iteradorContactos.podeRecuar() || iteradorDatas.podeRecuar();
  87. }
  88.  
  89. @Override
  90. public Contacto recuar() {
  91. if (!iteradorContactos.podeRecuar()){
  92. Data anterior = iteradorDatas.recuar();
  93. iteradorContactos = contactosPorData.consultar(anterior).iterador();
  94. }
  95.  
  96. return iteradorContactos.recuar();
  97. }
  98.  
  99. @Override
  100. public void reiniciar() {
  101. iteradorDatas.reiniciar();
  102. iteradorContactos = ITERADOR_CONTACTOS_VAZIO;
  103. }
  104.  
  105. @Override
  106. public Contacto corrente() {
  107. return iteradorContactos.corrente();
  108. }
  109.  
  110. @Override
  111. public boolean podeAvancar() {
  112. return iteradorContactos.podeAvancar() || iteradorDatas.podeAvancar();
  113. }
  114.  
  115. @Override
  116. public Contacto avancar() {
  117. if (!iteradorContactos.podeAvancar()){
  118. Data seguinte = iteradorDatas.avancar();
  119. iteradorContactos = contactosPorData.consultar(seguinte).iterador();
  120. }
  121. return iteradorContactos.avancar();
  122. }
  123. }
  124. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement