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.TabelaHashPorSondagem;
- import pt.ipleiria.estg.dei.aed.colecoes.iteraveis.associativas.estruturas.TabelaHashPorSondagemComIncrementoQuadratico;
- import pt.ipleiria.estg.dei.aed.colecoes.iteraveis.lineares.naoordenadas.estruturas.ListaDuplaNaoOrdenada;
- import pt.ipleiria.estg.dei.aed.colecoes.iteraveis.lineares.ordenadas.estruturas.ListaDuplaCircularBaseLimiteOrdenadaDistinta;
- import pt.ipleiria.estg.dei.aed.modelo.contactos.comparadores.ComparacaoLimiteDatasAscendente;
- public enum GestorContactosOtimizado {
- INSTANCIA;
- private static final IteradorIteravelDuplo<Contacto> ITERADOR_DUPLO_VAZIO = new ListaDuplaNaoOrdenada<Contacto>().iterador();
- private TabelaHashPorSondagem<Data, GestorDataContactos> contactosPorData; //utilizamos gestor pq ele ja tem a lista
- private ListaDuplaCircularBaseLimiteOrdenadaDistinta<Data> datas;
- private TabelaHashPorSondagem<Long, Contacto> tabelaContactosNumeroTelefone;
- GestorContactosOtimizado() {
- contactosPorData = new TabelaHashPorSondagemComIncrementoQuadratico<>(100);
- datas = new ListaDuplaCircularBaseLimiteOrdenadaDistinta<>(ComparacaoLimiteDatasAscendente.CRITERIO);
- tabelaContactosNumeroTelefone = new TabelaHashPorSondagemComIncrementoQuadratico<>(100);
- }
- public void inserir(Contacto contacto) {
- tabelaContactosNumeroTelefone.inserir(contacto.getNumeroTelefone(), contacto);
- Data dataNascimento = contacto.getDataNascimento();
- GestorDataContactos contactosNaData = contactosPorData.consultar(dataNascimento);
- if (contactosNaData == null) {
- contactosNaData = new GestorDataContactos(dataNascimento);
- contactosPorData.inserir(dataNascimento, contactosNaData);
- datas.inserir(dataNascimento);
- }
- contactosNaData.inserir(contacto);
- }
- public Contacto remover(Contacto contactoARemover) {
- long numeroTelefone = contactoARemover.getNumeroTelefone();
- Contacto contacto = tabelaContactosNumeroTelefone.consultar(numeroTelefone);
- //null.equals(contactoARemover) -- nullpointerexeption
- if (!contactoARemover.equals(contacto)) {
- return null;
- }
- Contacto contactoRemovido = tabelaContactosNumeroTelefone.remover(numeroTelefone);
- removerDosContactosNaData(contactoRemovido);
- return contactoRemovido;
- }
- public IteradorIteravelDuplo<Contacto> remover(Data dataNascimento) {
- GestorDataContactos contactosNaData = contactosPorData.remover(dataNascimento);
- if (contactosNaData == null) {
- return ITERADOR_DUPLO_VAZIO;
- }
- datas.remover(dataNascimento);
- IteradorIteravelDuplo<Contacto> iterador = contactosNaData.iteradorContactos();
- /*while (iterador.podeAvancar()){
- Contacto contacto = iterador.avancar();
- tabelaContactosNumeroTelefone.remover(contacto.getNumeroTelefone());
- }*/
- for (Contacto contacto : iterador) {
- tabelaContactosNumeroTelefone.remover(contacto.getNumeroTelefone());
- }
- iterador.reiniciar(); //para nao devolver o iterador ja no fim
- return iterador;
- }
- public Contacto remover(long numeroTelefone) {
- Contacto contactoRemovido = tabelaContactosNumeroTelefone.remover(numeroTelefone);
- if (contactoRemovido == null) {
- return null;
- }
- removerDosContactosNaData(contactoRemovido);
- return contactoRemovido;
- }
- public void removerDosContactosNaData(Contacto contactoRemovido) {
- Data dataNascimento = contactoRemovido.getDataNascimento();
- GestorDataContactos contactosNaData = contactosPorData.consultar(dataNascimento);
- contactosNaData.remover(contactoRemovido);
- if (contactosNaData.isVazio()) {
- contactosPorData.remover(dataNascimento);
- datas.remover(dataNascimento);
- }
- }
- public IteradorIteravelDuplo<Contacto> consultar(Data dataNascimento) {
- GestorDataContactos contactosNaData = contactosPorData.consultar(dataNascimento);
- if (contactosNaData == null) {
- return ITERADOR_DUPLO_VAZIO;
- }
- return contactosNaData.iteradorContactos();
- }
- public Contacto consultar(long numeroTelefone) {
- return tabelaContactosNumeroTelefone.consultar(numeroTelefone);
- }
- public IteradorIteravelDuplo<Contacto> consultar(Data dataNascimentoInicio, Data dataNascimentoFim) {
- return new Iterador(dataNascimentoInicio, dataNascimentoFim);
- }
- private class Iterador implements IteradorIteravelDuplo<Contacto> {
- private IteradorIteravelDuplo<Data> iteradorDatas;
- private IteradorIteravelDuplo<Contacto> iteradorContactos;
- public Iterador(Data dataNascimentoInicio, Data dataNascimentoFim) {
- iteradorDatas = datas.consultar(dataNascimentoInicio, dataNascimentoFim);
- iteradorContactos = ITERADOR_DUPLO_VAZIO;
- }
- @Override
- public boolean podeRecuar() {
- return false;
- }
- @Override
- public Contacto recuar() {
- if (!iteradorContactos.podeRecuar()) {
- //Data proximaData = iteradorDatas.avancar();
- //GestorDataContactos contactosNaData = contactosPorData.consultar(proximaData);
- //iteradorContactos = contactosNaData.iteradorContactos();
- iteradorContactos = contactosPorData.consultar(iteradorDatas.recuar()).iteradorContactos();
- }
- return iteradorContactos.recuar();
- }
- @Override
- public void reiniciar() {
- iteradorDatas.reiniciar();
- iteradorContactos = ITERADOR_DUPLO_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 proximaData = iteradorDatas.avancar();
- //GestorDataContactos contactosNaData = contactosPorData.consultar(proximaData);
- //iteradorContactos = contactosNaData.iteradorContactos();
- iteradorContactos = contactosPorData.consultar(iteradorDatas.avancar()).iteradorContactos();
- }
- return iteradorContactos.avancar();
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement