Collections - Set

Objeto

 public class Cat {

 

 private String nome;

 private int idade;

 

 public Cat(String anome, int aidade) {

         nome = anome;

         idade = aidade;

 }

 

 public String getNome() {

         return nome;

 }

 

 public int getIdade() {

         return idade;

 }

 

 public String toString() {

         return nome;

 }

 }

 

Set (HashSet, TreeSet) não permite duplicata.

 HashSet<Cat> lista = new HashSet<Cat>();

 

 Cat gato1 = new Cat("Mimi"1);

 Cat gato2 = new Cat("Chip"1);

 lista.add(gato1);

 lista.add(gato2);

 lista.add(gato1);  // esta linha não conseguirá incluir o gato1 novamente (retorna false)

         

 System.out.println(lista);

O que torna 2 objetos iguais?

Os métodos hashCode e equals

O JVM compara o hashCode dos dois objetos. Se forem iguais, irá chamar o equals, se forem iguais são considerados o mesmo objeto

Veja o código:

 HashSet<Cat> lista = new HashSet<Cat>();

         

 Cat gato1 = new Cat("Mimi"1);

 Cat gato2 = new Cat("Chip"2);

 Cat gato3 = new Cat("Pixixiu"1);

 

 lista.add(gato1);

 lista.add(gato2);

 lista.add(gato3);

 

 System.out.println(lista);

 

Neste caso os 3 gatos serão incluídos na lista...

Vamos fazer o Cat ser igual se tiver a mesma idade, independente de nome.

Objeto 2

 public class Cat {

 

 private String nome;

 private int idade;

 

 public Cat(String anome, int aidade) {

         nome = anome;

         idade = aidade;

 }

 

 public String getNome() {

         return nome;

 }

 

 public int getIdade() {

         return idade;

 }

 

 public String toString() {

         return nome;

 }

 // pulo do gato

 public boolean equals(Object outro) {

         Cat c = (Cat) outro;

         return (idade == c.getIdade());

 }

 // pulo do gato 2        

 public int hashCode() {

         return idade;

 }

 }

 

Agora se executarmos o programa, o gato3 não entrará na lista, pois o JVM usará o equals e será igual do gato1.

Listas ordenadas

         TreeSet<String> lista = new TreeSet<String>();

         lista.add("Chip");

         lista.add("Ananias");

         lista.add("Zabumba");

         System.out.println(lista);

 

Saída: [Ananias, Chip, Zabumba] 

Lembre-se o objeto a ser comparado deve implementar a interface Comparable e implementar o método compareTo

 

Atenção: mais lento