Contenedores III: Sets

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:

  • Set(interfaz) : Cada elemento que se añada debe ser único. Si no es así set no lo almacenará. Por lo tanto los objetos deben implementar el método equals() para poder hacer la comparacion.
  • HashSet : En los objetos set en los que el tiempo de búsqueda sea MUY importante deberá definirse tambien HashCode()
  • TreeSet : Un set ordenado respaldado por un arbol.
// 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.

  • Comparator comparator() : Devuelve un objeto Comparator.
  • Object first() : Devuelve el objeto menor
  • Object last() : Devuelve el objeto mayor
  • SortedSet subSet(desdeElemento, hastaElemento) Pues eso, un subset desde (incuido) hasta(excuido)
  • SortedSet headSet( hastaElemento) Pues eso, un subset desde el principio con los elementos menores a hasta
  • SortedSet tailSet( desdeElemento) Pues eso, un subset desde el elemento desdeElemento con los elementos mayores o iguales a desdeElemento
 
java/16.txt · Última modificación: 2008/05/13 10:00 (editor externo)
 
Excepto donde se indique lo contrario, el contenido de esta wiki se autoriza bajo la siguiente licencia:CC Attribution-Noncommercial-Share Alike 3.0 Unported
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki