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);
}
}

6 comentarios:

  1. Me salvaste hermano! No sabía donde estaba el error y al ver tu artículo lo encontré!!! Gracias!!!

    MoniMou:)

    ResponderEliminar
  2. Mefue muy util tu post, en cuanto a un pequeño error que tenia con el metodo compareTo()

    Gracias

    ResponderEliminar
  3. busco como TreeMap o TreeSet organizan los Nodos. :S se que es con arbol rojo-negro pero no se como funciona ese ordenamiento,

    ResponderEliminar
  4. una consulta, el treeset no acepta repetidos, pero como controlar los repetidos, osea lo que no se agrega??...algo asi como ke te debuelva lo que se repitio

    ResponderEliminar
  5. Muchas gracias de parte de una novata a la q has salvado la mañana en la oficina ;-)

    ResponderEliminar