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.TabelaHashPorSondagemComIncrementoPorHash;
- 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.contactos.Comparadores.ComparacaoLimiteContactosPorPrimeiroNomeAscendenteSeguidoPorUltimoNomeAscendente;
- import pt.ipleiria.estg.dei.aed.modelo.contactos.Comparadores.ComparacaoLimiteDatasAscendente;
- import pt.ipleiria.estg.dei.aed.modelo.pessoas.hashings.HashingIncremento;
- public enum GestorContactosOtimizado {
- INSTANCIA;
- public static final IteradorIteravelDuplo<Contacto> ITERADOR_VAZIO = new ListaDuplaCircularBaseLimiteOrdenada<>(ComparacaoLimiteContactosPorPrimeiroNomeAscendenteSeguidoPorUltimoNomeAscendente.CRITERIO).iterador();
- private TabelaHashPorSondagemComIncrementoQuadratico<Data, GestorContactosNumaData> contactosPorDataNascimento;
- private ListaDuplaCircularBaseLimiteOrdenadaDistinta<Data> datasNascimento;
- private TabelaHashPorSondagemComIncrementoQuadratico<Long, Contacto> contactosPorNumeroTelefone;
- GestorContactosOtimizado(){
- contactosPorDataNascimento = new TabelaHashPorSondagemComIncrementoQuadratico<>(20);
- datasNascimento = new ListaDuplaCircularBaseLimiteOrdenadaDistinta<>(ComparacaoLimiteDatasAscendente.CRITERIO);
- contactosPorNumeroTelefone = new TabelaHashPorSondagemComIncrementoQuadratico<>(20);
- }
- public void inserir(Contacto contacto){
- //ficha 7
- contactosPorNumeroTelefone.inserir(contacto.getNumeroTelefone(), contacto);
- //obter o gestor de contactos que nasceram na mesma data
- Data dataNascimento = contacto.getDataNascimento();
- GestorContactosNumaData contactosNaDataNascimento = contactosPorDataNascimento.consultar(dataNascimento);
- //se gestor nao existir
- if(contactosNaDataNascimento == null){
- //criar a gestor
- contactosNaDataNascimento = new GestorContactosNumaData();
- //inserir a gestor na tabela de hash
- contactosPorDataNascimento.inserir(dataNascimento, contactosNaDataNascimento);
- //inserir a data no gestor de datas
- datasNascimento.inserir(dataNascimento);
- }
- //inserir o contacto no gestor de contactos respetivo
- contactosNaDataNascimento.inserir(contacto);
- }
- public Contacto remover(Contacto contactoARemover){
- //ficha7
- long numeroTelefone;
- if(contactoARemover == null || !contactoARemover.equals(contactosPorNumeroTelefone.consultar(numeroTelefone = contactoARemover.getNumeroTelefone()))){
- return null;
- }
- contactosPorNumeroTelefone.remover(numeroTelefone);
- //////////////////////////////////////////////////////////////////////////////////////
- /* Data dataNascimento = contactoARemover.getDataNascimento();
- //obter a lista de contactos que nasceram na mesma data de nascimento
- ListaDuplaCircularBaseLimiteOrdenada<Contacto> contactosNaDataNascimento = contactosPorDataNascimento.consultar(dataNascimento);
- //se a lista nao existir
- // if(contactosNaDataNascimento == null){
- //nao ha nada para remover e devolve null
- // return null;
- //}
- Contacto contactoRemovido = contactosPorNumeroTelefone.remover(numeroTelefone);
- //vereficar se a lista ficou vazia
- if(contactosNaDataNascimento.isVazia()){
- //remover a lista da tabela de hash
- contactosPorDataNascimento.remover(dataNascimento);
- //remover a data da lista de datas
- datasNascimento.remover(dataNascimento);
- }
- //devolver o contacto que efetivamente foi removido*/
- return removerDosContactosPorDataNascimento(contactoARemover);
- }
- public IteradorIteravelDuplo<Contacto> remover(Data dataNascimento){ //podem ser varios
- //remover a lista com todos os contactos que nasceram nesse data
- //se esssa lista for nula
- //devolver iterador vazio
- //caso contrario
- //remover a data da lista das datas de nascimento
- //devolver o iterador da lista
- ListaDuplaCircularBaseLimiteOrdenada<Contacto> contactosNaDataNascimento;
- if(dataNascimento == null || (contactosNaDataNascimento = contactosPorDataNascimento.remover(dataNascimento)) == null){
- return ITERADOR_VAZIO;
- }
- datasNascimento.remover(dataNascimento);
- //ficha 7
- for (Contacto contacto : contactosNaDataNascimento) {
- contactosPorNumeroTelefone.remover(contacto.getNumeroTelefone());
- }
- return contactosNaDataNascimento.iterador();
- }
- public Contacto remover(long numeroTelefone){
- Contacto contactoRemovido = contactosPorNumeroTelefone.remover(numeroTelefone);
- if( contactoRemovido == null){
- return null;
- }
- /* Data dataNascimento = contactoRemovido.getDataNascimento();
- //obter a lista de contactos que nasceram na mesma data de nascimento
- ListaDuplaCircularBaseLimiteOrdenada<Contacto> contactosNaDataNascimento = contactosPorDataNascimento.consultar(dataNascimento);
- contactosNaDataNascimento.remover(contactoRemovido);
- //vereficar se a lista ficou vazia
- if(contactosNaDataNascimento.isVazia()){
- //remover a lista da tabela de hash
- contactosPorDataNascimento.remover(dataNascimento);
- //remover a data da lista de datas
- datasNascimento.remover(dataNascimento);
- }
- //devolver o contacto que efetivamente foi removido
- return contactoRemovido;*/
- //devolver o contacto que egitaivamneet foi removido
- return removerDosContactosPorDataNascimento(contactoRemovido);
- }
- private Contacto removerDosContactosPorDataNascimento(Contacto contacto){
- Data dataNascimento = contacto.getDataNascimento();
- //obter a lista de contactos que nasceram na mesma data de nascimento
- ListaDuplaCircularBaseLimiteOrdenada<Contacto> contactosNaDataNascimento = contactosPorDataNascimento.consultar(dataNascimento);
- //remover o contacto da lista(visyo que a lista nao esta vazia)
- Contacto contatactoRemovido = contactosNaDataNascimento.remover(contacto);
- //vereficar se a lista ficou vazia
- if(contactosNaDataNascimento.isVazia()){
- //remover a lista da tabela de hash
- contactosPorDataNascimento.remover(dataNascimento);
- //remover a data da lista de datas
- datasNascimento.remover(dataNascimento);
- }
- //devolver o contacto que efetivamente foi removido
- return contatactoRemovido;
- }
- public IteradorIteravelDuplo<Contacto> consultar(Data dataNascimento){
- //obter a lista de contactos que nasceram nessa data
- //se ess alisra nao existir
- //devolver o iterador de uma lista vazia
- //senao, devolver o iterador da lista
- ListaDuplaCircularBaseLimiteOrdenada<Contacto> contactosNaDataNascimento = contactosPorDataNascimento.consultar(dataNascimento);
- return contactosNaDataNascimento != null ? contactosNaDataNascimento.iterador() : ITERADOR_VAZIO;
- }
- public IteradorIteravelDuplo<Contacto> consultar(Data dataNascimentoInicio, Data dataNascimentoFim){
- return new Iterador(dataNascimentoInicio, dataNascimentoFim);
- }
- private class Iterador implements IteradorIteravelDuplo<Contacto>{
- IteradorIteravelDuplo<Data> iteradorDatasNascimento;
- IteradorIteravelDuplo<Contacto> iteradorContactos;
- public Iterador(Data dataNascimentoInicio, Data dataNascimentoFim) {
- iteradorDatasNascimento = datasNascimento.consultar(dataNascimentoInicio,dataNascimentoFim);
- reiniciar();
- }
- @Override
- public boolean podeRecuar() {
- return iteradorContactos.podeAvancar() || iteradorDatasNascimento.podeRecuar();
- }
- @Override
- public Contacto recuar() {
- if(!iteradorContactos.podeRecuar()){
- iteradorContactos = contactosPorDataNascimento.consultar(iteradorDatasNascimento.recuar()).iterador();
- }
- return iteradorContactos.recuar();
- }
- @Override
- public void reiniciar() {
- iteradorDatasNascimento.reiniciar();
- iteradorContactos = ITERADOR_VAZIO;
- }
- @Override
- public Contacto corrente() {
- return iteradorContactos.corrente();
- }
- @Override
- public boolean podeAvancar() {
- return iteradorContactos.podeAvancar() || iteradorDatasNascimento.podeAvancar();
- }
- @Override
- public Contacto avancar() {
- if(!iteradorContactos.podeAvancar()){
- iteradorContactos = contactosPorDataNascimento.consultar(iteradorDatasNascimento.avancar()).iterador();
- }
- return iteradorContactos.avancar();
- }
- }
- private class GestorContactosNumaData {
- private ListaDuplaCircularBaseLimiteOrdenada<Contacto> contactos;
- private TabelaHashPorSondagemComIncrementoQuadratico<String, ListaDuplaCircularBaseLimiteOrdenada<Contacto>> contactosPorMorada;
- public GestorContactosNumaData() {
- contactos = new ListaDuplaCircularBaseLimiteOrdenada<>(ComparacaoLimiteContactosPorPrimeiroNomeAscendenteSeguidoPorUltimoNomeAscendente.CRITERIO);
- contactosPorMorada = new TabelaHashPorSondagemComIncrementoQuadratico<>(20);
- }
- public void inserir(Contacto contacto) {
- contactos.inserir(contacto);
- String morada = contacto.getMorada();
- ListaDuplaCircularBaseLimiteOrdenada<Contacto> contactosNaMorada = contactosPorMorada.consultar(morada);
- if(contactosNaMorada == null){
- contactosNaMorada = new ListaDuplaCircularBaseLimiteOrdenada<>(ComparacaoLimiteContactosPorPrimeiroNomeAscendenteSeguidoPorUltimoNomeAscendente.CRITERIO);
- contactosPorMorada.inserir(morada, contactosNaMorada);
- }
- contactosNaMorada.inserir(contacto);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement