Não repetir objeto na collection

6 respostas
Michel_M

Bom dia pessoal

Está procurando na net, uma collection que não pode se add um objeto repetido. Achei hashSet mais pelo o que eu vi na net eu tenho que implementar hashCode dendro dessa minha classe, para por exemplo atribuir um indice para esse meu objeto.
Peço uma ajuda a vcs, se eu compreendi de maneira errada…

Por favor se alguém poder me ajudar eu agradeço desde já… Mostrando um exemplo…

6 Respostas

malucocelo

Você deve implementar o equals e o hashCode para garantir a comparação de um objeto com o outro e assim evitar a repetição. A IDE que você usa(por exemplo: Eclipse) pode facilitar a implementação desses métodos. No Eclipse pode-se gerar clicando com o botão direito do mouse>source>Generate equals e hashCode. Daí você seleciona os campos que serão comparados.

wagnerfrancisco

O que você entende por repetido?

O Set naturalmente não deixa inserir elementos repetidos. Entretanto se o teu critério de igualdade não for o padrão, aí sim você tem que implementar equals/hashCode.

E

Em particular eu gosto mais de TreeSet/TreeMap e usar um Comparator (ou implementar Comparable, mas isso também não gosto porque “força a barra”).

A vantagem é que os elementos ficam ordenados - isso para mim é mais intuitivo e útil que o tal do hashCode + equals (para um HashSet/HashMap funcionar corretamente, AMBOS os métodos têm de ser corretamente implementados, não somente hashCode.)

A desvantagem é que a coleção ordenada é ligeiramente mais lenta, mas isso normalmente não é problema.

Michel_M

Teria uma outra forma de fazer, sem a implementação destes métodos??.. ou senão uma outra collection que não necessite fazer isto?

Michel_M

wagnerfrancisco:
O que você entende por repetido?

O Set naturalmente não deixa inserir elementos repetidos. Entretanto se o teu critério de igualdade não for o padrão, aí sim você tem que implementar equals/hashCode.

Um objeto com atributos com o msm valor, independente de case sensitive.

wagnerfrancisco

Qual o problema com a implementação destes métodos? Em algum momento você precisa definir o que são objetos iguais no teu sistema. :smiley:

Se quiser, pode usar o EqualsBuilder/HashCodeBuilder da lib apache commons. Ele tem métodos que fazem isto via reflection, aí você não precisa ficar implementando tudo. O teu equals seria algo assim sempre:

@Override
public boolean equals(Object obj) {
   return EqualsBuilder.reflectionEquals(this, obj);
}

E o hashCode:

public int hashCode() {
   return HashCodeBuilder.reflectionHashCode(this);
}

Isto compara todas as propriedades.

Certamente isto é bem mais lento. Mas aí tu avalia se isto é problema ou não.

Criado 18 de julho de 2012
Ultima resposta 18 de jul. de 2012
Respostas 6
Participantes 4