Como usar a interface list Set?

Pessoal, como sabem, Set não deixa repetir objetos, e ela faz esta comparação com base no método equals dos objetos, certo?

Pois bem, eu subscrevi o método equals dos objetos, fazem comparacao via ID …

porém, não está funcionando, o corre o seguinte erro:

cannot be cast to java.lang.Comparable

Estou criando o set assim:

Set carros = new TreeSet();

Qual o erro pessoal ?

Faça a classe implementar Comparable e implemente o método compareTo

amigo, fiz isso e não funcionou…

public boolean equals(Object a) { return this.compareTo(a) == 0 ? true : false; } @Override public int compareTo(Object a) { return (((Autor)a).getId() == getId()) ? 0 : 1; }

continua deixando eu inserir vários objetos com o mesmo ID!!!

o que pode ser ? :frowning:

1 - Ao sobrescrever equals, tente seguir esse algoritmo (dado que obj é o objeto passado como parâmetro):

1.1 - Veja se obj é nulo;
1.2 - Se não for nulo, veja se a classe dele é igual à classe do objeto que está sobrescrevendo [i]equals[/i] ([i]this.getClass()[/i]);
1.3 - Se a classe for a mesma, aí sim, faça as comparações de atributos;
1.4 - Se alguma das comparações acima for falsa, retorne [i]false[/i].
1.5 - Sobrescreva [i]hashCode() [/i]de acordo com os atributos de comparação utilizados em [i]equals()[/i].

2 - O método compareTo() segue basicamente as mesmas regras.

Veja a documentação da sun para maiores informações.

Pergunta: getId() retorna que tipo de variável? Primitiva (int, long, short…) ou objeto (Integer, Long, Short…)?

Long!

Então compare a igualdade com equals(), não com ==. Exemplo:

Long l1 = new Long(1);
Long l2 = new Long(1);

System.out.println(l1.equals(l2)); // imprime 'true'

System.out.println(l1 == l2); // imprime 'false'

Isso ocorre porque o == compara a referência na memória para o objeto. Como l1 e l2 referenciam objetos diferentes, o resultado será sempre false.
Já o equals() compara os valores dos objetos. No caso do exemplo, vai retornar true.

Ele ainda permite cadastrar id´s iguais!

PS: tirei o implements comparable …

;/

[quote=MrDataFlex]Pessoal, como sabem, Set não deixa repetir objetos, e ela faz esta comparação com base no método equals dos objetos, certo?
[/quote]

Não. A interface Set não faz nada. É uma interface. São as implementações de Set que não deixam que os objetos se repitam. Elas fazem isso porque é o contrato da interface Set. Como elas fazem isso depende da implementação.

O HashSet usa os métodos equals e hashCode para diferenciar os objetos. O TreeSet não usa o equals nem o hashCode. Por isso o seu codigo não funciona. O TreeSet assume que os objetos são Comparable. Ou seja que implementam compareTo(). Se os objetos que está usando não são comparable então tem que passar um Comparator no contrutor do TreeSet.

Se os seus objetos não poderem ser ordenados use HashSet. Se podem, use TreeSet.

Carro não é um objeto ordenável ( como se define se o carro A é menor que o carro B?) por isso
use HashSet

[quote=sergiotaborda][quote=MrDataFlex]Pessoal, como sabem, Set não deixa repetir objetos, e ela faz esta comparação com base no método equals dos objetos, certo?
[/quote]

Não. A interface Set não faz nada. É uma interface. São as implementações de Set que não deixam que os objetos se repitam. Elas fazem isso porque é o contrato da interface Set. Como elas fazem isso depende da implementação.

O HashSet usa os métodos equals e hashCode para diferenciar os objetos. O TreeSet não usa o equals nem o hashCode. Por isso o seu codigo não funciona. O TreeSet assume que os objetos são Comparable. Ou seja que implementam compareTo(). Se os objetos que está usando não são comparable então tem que passar um Comparator no contrutor do TreeSet.

Se os seus objetos não poderem ser ordenados use HashSet. Se podem, use TreeSet.

Carro não é um objeto ordenável ( como se define se o carro A é menor que o carro B?) por isso
use HashSet
[/quote]

Valeu sérgio, mas tipo. eu já subscrevi o método equals, assim :

public boolean equals(Object o) {
return (((Autor)o).getId().intValue() == this.getId().intValue()) ? true : false;
}

porém o set / HashSet está deixando eu add objetos com o mesmo id…

;(

[quote=MrDataFlex][quote=sergiotaborda]

O HashSet usa os métodos equals e hashCode para diferenciar os objetos.
[/quote]

Valeu sérgio, mas tipo. eu já subscrevi o método equals, assim :

   public boolean equals(Object o) {
	   return (((Autor)o).getId().intValue() == this.getId().intValue()) ? true : false;
   }

porém o set / HashSet está deixando eu add objetos com o mesmo id…
[/quote]

Leia o que eu disse. Vc não sobreescreveu hashCode por isso não funciona.

   public boolean equals(Object other) {
	   return o instanceof Autor && equals((Autor)other);
   }

   public boolean equals(Autor other) {
	   return other.getId().equals(this.getId()); // atenção que o ID pode ser null e ai dá pau
   }

   public int hashCode(){
          return getId().hashCode(); // atenção que o ID pode ser null e ai dá pau
   }