domingo, 30 de enero de 2011

Manejar colecciones ordenadas TreeSet y TreeMap

Pequeña explicación sobre los árboles en Java. (encontrado en toolboxnet)
TreeSet
¿Que necesitamos?
Modificar la clase Producto (clase que vamos a almacenar) implementando Comparable. 
Está interfaz necesita sobrescribir el método compareTo indica que atributos se usaran para comparar.

import java.util.*; 
public class Producto implements Comparable { 

public String nombre; 
public int cantidad; 

public Producto(String s, int i) {
nombre = s;
cantidad = i;


public String toString(){
return ("Nombre: "+nombre+" Cantidad: "+cantidad);
}

public int compareTo( Object objeto ) {
// Indica en base a que atributos se compara el objeto
// Devuelve +1 si this es > que objeto
// Devuelve -1 si this es < que objeto
// Devuelve 0 si son iguales

Producto producto = (Producto)objeto;
String nombreObjeto = producto.nombre.toLowerCase();
String nombreThis = this.nombre.toLowerCase();

return( nombreThis.compareTo( nombreObjeto ) );
}
} 

TreeSet no permite elementos duplicados, mantiene la lista ordenada y el elemento a comparar debe contar con métodos equals, hashCode o compareTo

MercadoTreeSet.java 
import java.util.*; 
public class MercadoTreeSet 
public static void main(String args[])
{
// Definir 5 instancias de la Clase Producto 
Producto pan = new Producto("Pan", 6); 
Producto leche = new Producto("Leche", 2); 
Producto manzanas = new Producto("Manzanas", 5); 
Producto brocoli = new Producto("Brocoli", 2); 
Producto carne = new Producto("Carne", 2); 
Producto res = new Producto("Carne", 3); 

// Definir un TreeSet 
TreeSet lista = new TreeSet(); 
lista.add(pan); 
lista.add(leche); 
lista.add(manzanas); 
lista.add(brocoli); 
lista.add(carne); 
lista.add(res); 

// Imprimir contenido de TreeSet 
// Aunque se agregan 6 elementos, el TreeSet solo contiene 5 
// TreeSet no permite elementos duplicados, 
// TreeSet detecta que el elemento "Carne" esta duplicado 
// Notese que el orden del TreeSet refleja un orden ascendente 
mostrarLista(lista); 

// No es posible eliminar elementos por indice 
// Un TreeSet solo elimina por valor de Objeto 
lista.remove(manzanas); 
mostrarLista(lista); 

// Eliminar todos los valores del TreeSet 
lista.clear(); 
mostrarLista(lista);
}

public static void mostrarLista(Collection lista) {
System.out.println(" Lista del mercado con " + lista.size() +
" productos");
for( Iterator it = lista.iterator(); it.hasNext();) {
Producto producto = (Producto)it.next();
System.out.println(producto);
}
}
}


TreeMap
¿Que necesitamos?
Elementos están ordenados por la clave, se definen dos referencias de la interfaz SortedMap. En la primera se colocan las claves que se encuentran entre A y O. Método submap("A", "O") La segunda almacena las claves desde la P hacia el final. 
Estas comparaciones se han hecho con la clase String. Otras clases deberán definir sus propios métodos compareToequals o hashCode

AgendaTreeMap.java 
import java.util.*; 
public class AgendaTreeMap 
public static void main(String args[]) 
{ 
// Definir un TreeMap 
TreeMap agenda = new TreeMap(); 

// Agregar pares "clave"-"valor" al HashMap 
agenda.put("Doctor", "(+52)-4000-5000"); 
agenda.put("Casa", "(888)-4500-3400"); 
agenda.put("Hermano", "(575)-2042-3233"); 
agenda.put("Tio", "(421)-1010-0020"); 
agenda.put("Suegros", "(334)-6105-4334"); 
agenda.put("Oficina", "(304)-5205-8454"); 
agenda.put("Abogado", "(756)-1205-3454"); 
agenda.put("Papa", "(55)-9555-3270"); 
agenda.put("Tienda", "(874)-2400-8600"); 

// Notese que el orden del TreeMap refleja un orden ascendente 
// en sus elementos independientemente del orden de insercion. 
// Debido al uso de String se refleja un orden alfabetico 
mostrarMapa(agenda); 

// Definir dos TreeMap nuevos 
SortedMap agendaAO = agenda.subMap("A", "O"); 
SortedMap agendaPZ = agenda.tailMap("P"); 

System.out.println("---- Agenda A-O ----"); 
mostrarMapa(agendaAO); 

System.out.println("---- Agenda P-Z ----"); 
mostrarMapa(agendaPZ);


public static void mostrarMapa(Map agenda) {
System.out.println(" Agenda con " + agenda.size() +
" telefonos");
for( Iterator it = agenda.keySet().iterator(); it.hasNext();) {
String clave = (String)it.next();
String valor = (String)agenda.get(clave);
System.out.println(clave + " : " + valor);
}
}