Un set es una colecion normal y corriente sin ningún otro valor añadido que el de NO almacenar objetos con valores iguales. No admite repetidos. Las particularidades del set son:
// Set1.java
// cosas que se pueden hacer con un set
import java.util.*;
public class Set1{
public static void pruebaVisual(Set a){
for (int i=0; i<10; i++){
a.add(Integer.toString(i));
}
// vuelvo a añadir para comprobar si almacena repetidos
for (int i=0; i<10; i++){
a.add(Integer.toString(i));
}
System.out.println(a);
System.out.println("¿a contiene el valor \"1\" ? "+a.contains("1"));
}
public static void main(String[] args){
System.out.println("sets...");
System.out.println("HashSet...");
pruebaVisual(new HashSet());
System.out.println("TreeSet...");
pruebaVisual(new TreeSet());
}
}
pero si miras la salida verás que HashSet y TreeSet almacenan los valores de forma distinta: sets… HashSet… [3, 2, 1, 0, 7, 6, 5, 4, 9, 8] ¿a contiene el valor “1” ? true TreeSet… [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] ¿a contiene el valor “1” ? true
Al crear mi propio tipo, si quiero meterlo en un set debo implementar la interfaz Comparable a fin de que set pueda compararlos y ordenarlos. mira el siguiente ejemplo:
// Set2.java
// metiendo un tipo propio en un set
import java.util.*;
class MiTipo implements Comparable{
private int i;
public MiTipo(int n){ i=n;}
public boolean equals(Object o){
// hago la comparacion...
// ¿o es una instancia de MiTipo?
// y
// el valor de i en el objeto del tipo MiTipo o es igual al valor de i mio?
return ( (o instanceof MiTipo) && (i==((MiTipo)o).i ) );
}
// fijate que estamos reescriiendo los métodos... primero el valor de ordenacion
public int hashCode(){ return i; }
// ahora el metodo tostring para devolver el valor...
public String toString(){return i+" ";}
public int compareTo(Object o){
int i2 = ((MiTipo)o).i;
// sintentzación del if else...
return ( i2 < i ? -1 : (i2==i ? 0 : 1));
}
}
public class Set2{
public static Set rellenar(Set a, int tamano){
for (int i=0; i<tamano; i++){
a.add(new MiTipo(i));
}
return a;
}
public static void prueba(Set a){
rellenar(a,10);
System.out.println(a);
// vamos a intentar meter duplicados
rellenar(a,10);
rellenar(a,10);
a.addAll(rellenar(new TreeSet(),10));
System.out.println(a);
}
public static void main(String[] args){
prueba(new HashSet());
prueba(new TreeSet());
}
}
Observa como el resultado esta ordenado según el orden que yo le he dado.
HashSet [0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ] [0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ] [0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ] TreeSet [9 , 8 , 7 , 6 , 5 , 4 , 3 , 2 , 1 , 0 ] [9 , 8 , 7 , 6 , 5 , 4 , 3 , 2 , 1 , 0 ] [9 , 8 , 7 , 6 , 5 , 4 , 3 , 2 , 1 , 0 ]
Por último estan los objetos SortedSet que son un tipo de TreeSet. Que añaden ciertas funcionalidades sobretodo a la hora de ordenar.