Tecnologia do Blogger.
RSS

Re: [androidbrasil-dev] Erro bizarro em TreeSet.contains()

Thiago,
Pedro,

Acho que é por aí.
Na verdade, na tentativa de ser conciso vi que deixei informações importantes de lado.

A classe tem dois campos importantes e não um.
Algo tipo:

class Photo implements Parcelable, Comparable  {
String id;
long created;
// ...
}

O long é na verdade, uma entrada para datetime.

Só que para o hashCode() e equals() - só uso o campo id - que é o identificador único.
Mas para ordenar, utilizo somente o campo long.
Ficando assim:

@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((id == null) ? 0 : id.hashCode());
return result;
}

@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Photo other = (Photo) obj;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
return true;
}

@Override
public int compareTo(Photo photo) {
return (int) (photo.createdTime - this.createdTime);
}

Os métodos hashCode() e equals() foram gerados pelo Eclipse.

O que imagino é que esteja dando alguma confusão das grandes utilizar campos diferentes para igualdade e ordenação. Talvez devido ao tipo de busca na estrutura de árvore.



Em 2 de janeiro de 2014 16:03, Thiago Resek <thiago.ec05@gmail.com> escreveu:
Aliás, fazendo uns testes aqui, vi que ele chama os 2 métodos (equals e compareTo). Provavelmente ele deve fazer algum tipo de busca binária, dado que o conjunto é mantido ordenado.

Ou seja, o problema pode estar em qualquer um dos dois métodos.

Espero ter ajudado! Att,

Resek


2014/1/2 Thiago Resek <thiago.ec05@gmail.com>
Oi Gink,

Tenho quase certeza que o Comparable é usado pra identificar igualdade no TreeSet.

Veja na documentação:  "a TreeSet instance performs all element comparisons using its compareTo (or compare) method,"



Minha dica seria olhar no compareTo. Mas, por via das dúvidas, posta o código dos dois métodos aqui =)


2014/1/2 Pedro Cortez <pedro.fellipe.cortez@gmail.com>
Sim, de fato. Esse metodo equals seu que deve estár estranho. Posta ele ai por favor

att,
Pedro Cortez


2014/1/2 Gink Labrev <gink.labrev@gmail.com>
Sim, galera.

Esqueci de mencionar isso.
Estou implementando o Comparable sim (mas não Comparator).
Mas até onde sei, o Comparable é usado para ordenação. Não impacta no fato de identificar se dois objetos são iguais. Para isto, seria usado o hashCode() e equals().

Abs


Em 2 de janeiro de 2014 10:09, Flaviano Gomes <p4rdal@gmail.com> escreveu:

 X { String campo1; /* ... outros campos irrelevantes */ } 
 
 TreeSet<X> set = new TreeSet<X>(new Comparator<X>(){
                public String compare(X a, X b){
                    return a.campo1.equals(b.campo1);
                }
}


Em 2 de janeiro de 2014 07:08, Thiago Resek <thiago.ec05@gmail.com> escreveu:

Oi Gink,

Pra usar o TreeSet, sua classe X tem que implementar a interface Comparable, se não me engano (ou vc tem que fornecer um comparador).

Vc fez isso? Se sim, poste o código...Pode ser que o probelma esteja aí...


Abs;

Thiago Resek


2014/1/2 Gink Labrev <gink.labrev@gmail.com>
Pessoal,

Tenho uma classe assim

X { String campo1; /* ... outros campos irrelevantes */ } 

E usei o gerador automatico do Eclipse para hashCode() e equals(), levando em conta somente o campo1.

Dado o seguinte.

X x1 = new X("A");
X x2 = new X("B");
X x3 = new X("C");

Se faço x1.equals(x2) e x1.equals(x3) dá false, conforme esperado.
Mas se faço:

Set<X> ts = new TreeSet<X>();
ts.add(x2);
ts.add(x3);
ts.contains(x1);

O código acima retorna true !!
O que pode estar acontecendo ??

Abs;


--
You received this message because you are subscribed to the Google Groups "Android Brasil - Dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email to androidbrasil-dev+unsubscribe@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.



--
Thiago Resek Fabri dos Anjos
Computer Engineer

--
You received this message because you are subscribed to the Google Groups "Android Brasil - Dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email to androidbrasil-dev+unsubscribe@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.



--
Flaviano Danilo Gomes
[Aracaju - SE - Brazil]

--
You received this message because you are subscribed to the Google Groups "Android Brasil - Dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email to androidbrasil-dev+unsubscribe@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.

--
You received this message because you are subscribed to the Google Groups "Android Brasil - Dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email to androidbrasil-dev+unsubscribe@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.

--
You received this message because you are subscribed to the Google Groups "Android Brasil - Dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email to androidbrasil-dev+unsubscribe@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.



--
Thiago Resek Fabri dos Anjos
Computer Engineer



--
Thiago Resek Fabri dos Anjos
Computer Engineer

--
You received this message because you are subscribed to the Google Groups "Android Brasil - Dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email to androidbrasil-dev+unsubscribe@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.

--
You received this message because you are subscribed to the Google Groups "Android Brasil - Dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email to androidbrasil-dev+unsubscribe@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.

  • Digg
  • Del.icio.us
  • StumbleUpon
  • Reddit
  • RSS

0 comentários:

Postar um comentário