Oi, Gink.
Abs,
Segundo o link da documentação que mandei, diz que "The behavior of a set is well-defined even if its ordering is inconsistent with equals; it just fails to obey the general contract of the
Set
interface".Sua implementação não está consistente com o equals(). Por exemplo, duas fotos com ID diferente mas mesmo createdTime retornariam 0 no compareTo mas o equals() retornaria false.
Minha sugestão seria a seguinte: caso os createdTimes sejam iguais, verifique os IDs. Se os IDs forem diferentes, retorne algo diferente de 0 (o que fizer mais sentido na sua lógica).
Testa aí e depois nos diz o resultado!
Abs,
Resek
2014/1/2 Gink Labrev <gink.labrev@gmail.com>
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:@Overridepublic int hashCode() {final int prime = 31;int result = 1;result = prime * result + ((id == null) ? 0 : id.hashCode());return result;}
@Overridepublic 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;}@Overridepublic 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: "aTreeSet
instance performs all element comparisons using itscompareTo
(orcompare
) 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 favoratt,
Pedro Cortez2014/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().AbsEm 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 assimX { 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.
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.
0 comentários:
Postar um comentário