La Interfaz Set
Es una colección que no permite elementos repetidos. La interfaz
Set
contiene sólo métodos heredados de Collection
y
aumenta la restricción de elementos duplicados. Esta interfaz
tiene un contrato con un comportamiento más específico en
operaciones con equals
y hashCode
, permitiéndo a instancias de
esta interfaz ser comparadas significativamente aún si el tipo de
iimplementación difiere. Dos instancias de Set son iguales si
ellas contienen los mismos elementos.
Java dispone de 3 implementaciones generales de Set: HashSet,
TreeSet y LinkedHashSet
. La primera HashSet
, almacena sus elementos en
una tabla Hash, es la implementación más eficiente.
TreeSet
, guardar sus elementos en un árbol, ordenando sus
elementos en base a sus valores, y por lo tanto es más lento que
un HashSet. LinkHashSet
, por otro lado es implementada por una tabla
Hash con una lista enlazada a través de ella, ordenando sus
elementos en base a como han sido insertados. LinkedHashSet
tiene un
costo más alto de rendimiento que un HashSet
.
Aquí tenemos un ejemplo. Supongamos que tenemos una
Collection c
, y queremos crear otra colección la cual contenga
los mismos elementos pero todos los duplicados sean eliminados.
Collection<Type> noDuplicados = new HashSet<Type>(c);
Lo que hace esto es crear un Set
, cuya definición no permite duplicados, inicialmente conteniendo todos los elementos en c. Usa el constructor por defecto de Collection.
Operaciones Básicas:
La operación size
, retorna el número de elementos en el Set
, su cardinalidad. El método isEmpty
, hace exactamente lo que su nombre indica, verifica si se encuentra vacía. El método add
, aumenta el elemento especificado, si este no se encuentra presente y retorna un booleano indicando si este fue o no insertado. Así mismo el método remove
elimina el elemento especificado del Set si está presente. Retorna verdadero o falso si el elemento está o no presente. El método iterator
retorna un Iterator
sobre el Set
.
public class BuscarDuplicados { Set<String> s = new HashSet<String>(); for (String cadena : args) if (!s.add(a)) System.out.println("Duplicados encontrados: " + cadena); System.out.println(s.size() + " palabras diferentes: " + s);
Nótese que el código se refiere a Collection
por su interfaz Set
al contrario de su implementación HashSet
. Esto es muy recomendado, debido a que esto nos da la flexibilidad de cambiar las implementaciones simplemente cambiando el constructor. Si alguna de las variables usada para almacenar la colección o los parámetros usados para pasarlo por la implementación de Collection
en lugar de su tipo de interfaz, todas esas variables y parámetros tendrán que ser cambiados para poder cambiar el tipo de su implementación.
El tipo de implementación de Set
en el ejemplo anterior es HashSet
, lo que garantiza que los elementos estén ordenados en el Set
. Si deseamos que el programa imprima en orden alfabético, sólo cambiaríamos el tipo de implementación de HashSet a TreeSet
.
Operaciones adicionales.
Supóngase que s1 y s2 son Sets, y las operaciones sobre estos:
s1.containsAll(s2)
- retorna true si s2 es una sub colección de s1, es decir si s1 contiene todos los elementos de s2.s1.addAll(s2)
- transforma a s1 en la unión de s1 y s2.s1.retainAll(s2)
- transforma a s1 en la intersección de s1 y s2. La diferencia entre s1 y s2.