Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

DÚVIDAS DE HASHCODE E EQUALS COM HASHMAP

            Banco banco = new Banco();
            Random random = new Random();

            ContaCorrente cc1 = new ContaCorrente(500);
            cc1.setNome("Maria");
            cc1.setNumeroConta(10);

            ContaCorrente cc2 = new ContaCorrente(500);
            cc2.setNome("José");
            cc2.setNumeroConta(10);

            ContaPP contaPP = new ContaPP(500);
            contaPP.setNome("Joaquim");
            contaPP.setNumeroConta(10);


            banco.adiciona(cc1);
            banco.adiciona(cc2);

            banco.adiciona(contaPP);


            System.out.println(banco.buscaPorNomeMap("Maria"));                        

            System.out.println(banco.contas.size());

--------------------- CLASS BANCO ------------------------------------------------

public class Banco {

        //List<Conta> contas = new ArrayList<Conta>();
        Map<String, Conta> contas = new HashMap<String, Conta>();            // Indica que só aceita, a chave como STRING, e OBJECT do tipo CONTA


// MÉTODOS            

        public int pegaQuantidadeDeContas(){
            return contas.size();                                           // Método SIZE do ArrayList já retorna um INT
        }

        public Conta buscaPorNomeMap(String nome){
                                                                            // 1.1 Método "get" do ArrayList, provavelmente é BOOLEAN
            return contas.get(nome);                                        // 1.2 Lembrando que o "get" utiliza o método "toString", "OLHAR se ele não foi SOBRESCRITO"
        }

        public  Conta buscaPorNome(String nome) throws NullPointerException{        // Método para buscar nome sem o HashMap
                for(int i = 0; i < contas.size() ;i++){
                    if(contas.get(i).getNome().equals(nome)){
                        return contas.get(i);
                    }
                }

                throw new NullPointerException("Nome não encotrado!");                // Envia um Exception
                //return null;                                                // Se não encontrar no ArrayList a conta com o nome desejado, retorna NULL 
        }





// GET E SET (PARA NO ARRAYLIST)

        public void adiciona(Conta c){                                // Método para ADD no HashMap (OBS: o nome já foi decidido no main)
            contas.put(c.getNome() , c);
        }

        /**
        public void adiciona(Conta c){                                // Método para ADD no ArrayList        
            contas.add(c);
        }
        */
        public Conta pegaConta(int x){
            return contas.get(x);                                    // Irá retornar a posição da conta desejada
        }


}    // FECHA CLASS

---------------------------------- CLASSE CONTA ------------------------------

protected int numeroConta;
    protected double saldo;
    protected String nome;
    protected int agencia;


@Override                                        // 1.1 Sobrescrevendo o Método de heranças 
    public int compareTo(Conta outra) {                // 1.2 Aqui está sobrescrevendo o método, para indicar ao utilizar o "sort" de "Collection"
        if(this.saldo < outra.saldo) return -1;        // 1.3 Criando uma regra para ordenar do menor número para o maior
        if(this.saldo > outra.saldo) return 1;      // 1.4 Collection.sort = Utiliza-se desse método para criar uma regra de "ordenação"

            return 0;
    }
    /**                                                // Desse modo faria o "sort" do Collection, ordenar por ORDEM ALFABÉTICA
    @Override
    public int compareTo(Conta outra) {
        return this.nome.compareTo(outra.nome);
    }**/

    @Override // Sobrescreve
    public String toString() {                        // 1.1 Aqui estou SOBREESCREVENDO o método toString da Mãe(OBJECT)- Em vez de usar o toString da class OBJECT usa esse da CONTA
        return "Nome: " + getNome();                // 1.2 Já que todas as Class HERDAM de Object e toString é um método da class Object
    }

    /* (non-Javadoc)
     * @see java.lang.Object#hashCode()
     */
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + numeroConta;
        return result;
    }



    /* (non-Javadoc)
     * @see java.lang.Object#equals(java.lang.Object)
     */
    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null) {
            return false;
        }
        if (!(obj instanceof Conta)) {
            return false;
        }
        Conta other = (Conta) obj;
        if (numeroConta != other.numeroConta) {
            return false;
        }
        return true;
    }
  • Minha dúvida é, que não consigo fazer com que o SIZE do HASHMAP, evite a repetição das contas que tem o mesmo númeroDeConta. Alguma ajuda ?'
3 respostas

Olá Frank,

No caso dos mapas o Hash é aplicado sobre as chaves. E pelo que percebi a chave utilizada para guardar as contas foi a String com nome do cliente. Dessa maneira, ele não levará em conta o valor de número de conta ao fazer o put, permitindo assim a entrada de contas com número repetido. Seu size então consideraria todas as contas adicionadas.

Tenta usar o próprio número de conta como chave para seu mapa. Perceba que você até já sobrescreveu o hashCode() levando em consideração o número. Sendo assim ao usá-lo como chave do mapa o hashCode() e equals() serão aplicados normalmente, impedindo a inserção de contas com numero repetido.

Espero ter ajudado, abraço!

solução!

Oi Frank, tudo bom?

Pelo o que eu entendi, você quer fazer uma busca no seu map evitando repetição das contas, certo?

Para isso, você pode resgatar todos os valores do seu map com o método values.

Esse método vai te retornar todos os valores em uma Collection você pode utilizar qualquer Collection para eliminar as repetições =)

Qualquer dificuldade, compartilha com a gente!

Abraço.

Muito obrigado pela resposta de vocês.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software