Duvida com HashMap

7 respostas
M

Estou com uma dúvida, que penso ser bastante simples, mas não encontrei a solução. Como fazer para um HashMap não aceitar dois objetos iguais, porém que não possuem a mesma referencia? Por exemplo:

Point p1 = new Point(1,2); Point p2 = new Point(1,2); HashMap<Point, String> pontos = new HashMap<Point, String>(); pontos.put(p1, "Ponto 1,2"); pontos.put(p2, "Ponto 1,2");

Gostaria que ele considerasse p1 == p2 nesse caso. Alguma idéia de como fazer isso?

7 Respostas

Rafael_Nunes

Você deve implementar o método equals na classe Point.

M

Muito obrigado, funcionou corretamente

Rafael_Nunes

Não esquece o hashcode também, pra num ter problemas de performance.

Lavieri

qualquer coisa, le esse artigo aki

M

Vou ler sim, obrigado pela indicação.

J

Boas Pessoal.

Estou aqui com um problama que nao consigo descobrir… vejam lá se me podem ajudar.
O erro é no “put” e diz que nao encontra esse simbolo.

public void distribuirBarcos (int nj, int barco, int direccao)
    {
        int l;
        int c;
        hashRecusas.clear(); //hash que vai conter par de coordenadas recusados. Sempre que entra neste metodo esse hash é limpo.

        boolean pronto=false;
        do
        {
            //gerar linha aleatoriamente
            l = geraAleatorio(tabJogador.getBiDimensao());
            //gerar uma coluna aleatoriamente
            c = geraAleatorio(tabJogador.getBiDimensao());

            if (verificaRecusas(l, c)==false) //pode acontecer que esteja a gerar sempre o mesmo l ou sempre c's recusados.. e isto vai estar em loop, mas nao estou a ver maneira de fazer isto diferente.
            {
                //verificação se o barco segundo determinada linha, coluna e direcção pode ser construido dentro do tabuleiro escolhido
                boolean analisaFronteiras = verificaFronteiras(l, c, barco, direccao);

                //verificação se as casas onde vai estar o barco bem como à sua volta vão estar disponiveis
                //leva o numero do barco escolhido (barco) a direcção escolhida (direccao), a linha e a coluna (l, c) donde quer começar a construir o barco
                boolean analisaCasas = (validarCasas(nj, barco, direccao, l, c));

                //se ele passar na verificação das fronteiras do tabuleiro e na verificação das casas em si.. então consoante o barco e a direcçao escolhida vai-se construir o barco no tabuleiro
                if (analisaFronteiras && analisaCasas && barco==1 && direccao==1)
                {
                    numPa++; //esta variavel começa em 0 e vai incrementar sempre que mete um PA
                    this.barcosEmJogo.add(new PortaAvioes(numPa));
                    tabJogador.constroiCasa(new Casa(l, c, false, "p2PA", barco, numPa), l, c); //peça2
                    tabJogador.constroiCasa(new Casa(l+1, c, false, "BLD", barco, numPa), l+1, c);
                    tabJogador.constroiCasa(new Casa(l+1,c-1, false, "BLD", barco, numPa), l+1,c-1);
                    tabJogador.constroiCasa(new Casa(l+1,c+1, false, "BLD", barco, numPa), l+1,c+1);
                    tabJogador.constroiCasa(new Casa(l, c+1, false, "p3PA", barco, numPa), l, c+1);//peça 3
                    tabJogador.constroiCasa(new Casa(l+1,c+2, false, "BLD", barco, numPa), l+1,c+2);
                    tabJogador.constroiCasa(new Casa(l,c+2, false, "BLD", barco, numPa), l,c+2);
                    tabJogador.constroiCasa(new Casa(l-1,c+2, false, "BLD", barco, numPa), l-1,c+2);
                    tabJogador.constroiCasa(new Casa(l-1,c+1, false, "BLD", barco, numPa), l-1,c+1);
                    tabJogador.constroiCasa(new Casa(l, c-1, false, "p1PA", barco, numPa), l, c-1);//peça1
                    tabJogador.constroiCasa(new Casa(l+1,c-2, false, "BLD", barco, numPa), l+1,c-2);
                    tabJogador.constroiCasa(new Casa(l,c-2, false, "BLD", barco, numPa), l,c-2);
                    tabJogador.constroiCasa(new Casa(l-1,c-2, false, "BLD", barco, numPa), l-1,c-2);
                    tabJogador.constroiCasa(new Casa(l-1,c-1, false, "BLD", barco, numPa), l-1,c-1);
                    tabJogador.constroiCasa(new Casa(l-1, c, false, "p4PA", barco, numPa), l-1, c);//peça4
                    tabJogador.constroiCasa(new Casa(l-2,c-1, false, "BLD", barco, numPa), l-2,c-1);
                    tabJogador.constroiCasa(new Casa(l-2,c+1, false, "BLD", barco, numPa), l-2,c+1);
                    tabJogador.constroiCasa(new Casa(l-2, c, false, "p5PA", barco, numPa), l-2, c);//peça5
                    tabJogador.constroiCasa(new Casa(l-3,c, false, "BLD", barco, numPa), l-3,c);
                    tabJogador.constroiCasa(new Casa(l-3,c-1, false, "BLD", barco, numPa), l-3,c-1);
                    tabJogador.constroiCasa(new Casa(l-3,c+1, false, "BLD", barco, numPa), l-3,c+1);
                    memorizacaoBarcos.put(barco, memorizacaoPecas.put(numPa, "p1PA"));
                    pronto=true;
                }

…isto tem mais codigo à frente… acho que não é preciso mostrar…
O erro é nesse put memorizacaoBarcos.put(barco, memorizacaoPecas.put(numPa, “p1PA”)); que está mesmo no fim do codigo.

O que é que estou a fazer mal?

Obrigado pessoal.

J

Não sei o que estava mal (provavelmente uma coisa muito estupida) mas fiz primeiro um hash e depois o outro que por sua vez chamava o outro anterior e já deu… mas entretanto tb ja mudei pq cheguei à conclusao que nao era isso que eu keria. lol

Tks na mesma.

Criado 4 de maio de 2009
Ultima resposta 18 de jun. de 2009
Respostas 7
Participantes 4