viernes, 18 de mayo de 2012

Contenedores (Colecciones)


Definición:
     Los contenedores son el modo de agrupar objetos. También llamados colecciones (Collection). Representa a un conjunto de ítems, un conjunto de objetos, que pueden ser homogéneos o no. Por ejemplo, una agenda es una colección de datos de personas.



La interfaz Collection

     La interfaz collection es la superinterfaz de donde heredan la mayoría de las interfaces utilizadas para el manejo de las colecciones. Es la interfaz raíz de la jerarquía de interfaces.
     La interfaz collection forma parte del Collection Framework, un conjunto de interfaces y clases que representan distintos modos de agrupar objetos, según distintas políticas de manejo de memoria o acceso a ellos.
     Representan un conjunto de objetos, también llamados elementos. Una clase que quiera comportarse como una Collection deberá implementar esta interfaz, por lo tanto sus métodos.

Listas

La interfaz List


    Es una subinterfaz de Collection. También es llamada Secuencia. Puede contener objetos duplicados y objetos nulos. Soporta manipulación de elementos vía índices a través del método:     get(int índice), que permite obtener el elemento en la posición índice de la lista.
    También puede obtenerse el índice en el cual esta almacenado un determinado objeto, mediante el método: int indexOf(unObjeto).
    También permite trabajar con subconjunto de elementos de la lista con el método: List subList(int indiceDesde, int indiceHasta).

Las listas mas conocidas en java son: ArrayList, Vectir y Stack.

Clase ArrayList

Es una clase que implementa la interfaz Collection. Representa a un arreglo de tamaño variable. Los métodos mas comúnmente utilizados son add() , get() , size() y remove(). No maneja sincronización.

Public Class Auto {

   Prívate String patente;

   Public Auto(String patente){
                   This.patente = patente;
   }
  
Public Class Programa{
  
Public Programa(){

   }
   Public static void main (String [] args){
   List lista = new ArrayList();

   lista.add(new Auto(“123”);
   lista.add(new Auto(“456”);
  
   for ( int I = 0; I < lista.size(); i++){
   System.out.println(lista.get(i));
   }

   }
}

Clase Vector

Es semánticamente igual a la clase ArrayList. A diferencia de la clase ArrayList maneja sincronización.

La interfaz Set

     Es una subinterfaz de Collection, donde no puede haber elementos repetidos, y cuyos elementos no se almacenan necesariamente siguiendo un orden particular.

Clase HashSet

    Un HashSet es una estructura de datos que contiene un conjunto de objetos. Es una implementacion de Set y permite buscar un objeto dentro del conjunto de forma rápida y fácil. Internamente gestiona un array y guarda los objetos utilizando un índice calculado con un código hash del objeto.
El nombre HASH, hace referencia a una tecnica de organizacion de archivos llamada hashing o "dispersion" en el cual se almacenan registrso en una direccion del archivo que es generada por una funcion que se aplica sobre la llave del registro.
    Todos los objetos de Java pueden producir un código de tipo hash, y HashCode() es un método de la clase raíz Object. Un HashSet toma un hashCode() del objeto y lo utiliza para localizar rápidamente la clave. Esto redunda en una mejora dramática de rendimiento.

- Los elementos de un HashSet no están ordenados
- Para añadir un elemento al HashSet se utiliza el método add(Object obj).
- Para borrar un elemento se utiliza remove(Object obj).
- Para borrar todos los elementos se utiliza clear().
- El tamaño del HashSet se puede obtener con la función size()

        Set<String> hs = new HashSet<String>();
       
        String [] nombres = {"Jorge","Pepe","Juan","Ale"};
       
                for (int i = 0; i < nombres.length; i++) {
                hs.add(nombres[i]);
                }
       
        System.out.println("HashSet");
        System.out.println(hs.toString());
        System.out.println("");
       
        System.out.println("--------Metodo Remove--------");
        hs.remove("Pepe");
        System.out.println(hs.toString());
        System.out.println("");
       
        System.out.println("--------Metodo Clear---------");
        hs.clear();
        System.out.println(hs.toString());

La interfaz SortedSet

     Es una subinterfaz de la interfaz Set, es un conjunto de elementos ordenados. Algunos métodos importantes con los que permite trabajar son:
-Objetct first() à Devuelve el primer valor de la lista
-Object last() à Devuelve el ultimo valor de la lista
-SortedSet subSet(Object ElementoDesde, Object ElementoHasta) à Devuelve una sub SortedSet desde el elemento marcado como principio hasta el elemento marcado como fin.
-SortedSet headSet(Object ElementoHasta) à Devuelve una sub SortedSet desde el principio hasta el elemento marcado como fin.
-SortedSet tailSet(Object ElementoDesde) à Devuelve una sub SortedSet desde el fin hasta el element marcadado como principio.

Clase TreeSet

     Un TreeSet es una implementacion de SortedSet, mantiene los objetos ordenados en lo que se conoce como un red-black tree, es decir, en un árbol binario balanceado (cada padre tiene como máximo 2 hijos, y cuando se inserta una entrada se autobalancea de forma que quede un árbol binario simétrico).
Un TreeSet permite hacer búsquedas rápidas. No tanto como un HashSet, pero el TreeSet tiene la ventaja de estar ordenado por clave.
               
                  SortedSet<String> arbol = new TreeSet();
                 SortedSet<String> arbol2 = new TreeSet();
       
        String [] nombres = {"Jorge","Pepe","Juan","Ale"};
       
                               for (int i = 0; i < nombres.length; i++) {
                               arbol.add(nombres[i]);
                               }
       
                System.out.println("Arbol");
                System.out.println(arbol.toString());
                System.out.println("");
        
                System.out.println("--------Metodos first y last--------");
                System.out.println("Primer elemento del arbol: " + arbol.first());
                System.out.println("Ultimo elemento del arbol: " + arbol.last());
                System.out.println("");
       
                System.out.println("--------Metodo HeadSet--------");
                arbol2 = arbol.headSet("Pepe");
                System.out.println(arbol2.toString());
                System.out.println("");
       
                System.out.println("--------Metodo TailSet---------");
                arbol2 = arbol.tailSet("Jorge");
                System.out.println(arbol2.toString());

Mapas

La interfaz Map
     Es una interfaz a la misma altura, jerárquicamente hablando, de la interfaz Collection. Permite el almacenamiento de listas de valores (llave-lista de valores) y no puede contener valores duplicados (llaves). Algunos métodos importantes con los que permite trabajar son:

-Object put (Object llave, Object valor): inserta un objeto que se recibe en el parámetro valor bajo el valor de la llave específica.
-Object get (Object llave): Retorna el valor que se encuentra asociado a la llave que se pasa por parámetro
-boolean containsKey(Object llave): Devuelve verdadero, si el mapa contiene como llave al objeto especificado como parámetro.
-boolean containsValue(Object valor): Devuelve verdadero, si el mapa contiene como uno de sus valores al objeto especificado como parámetro.
-Collection Values():Retorna una colección con todos los valores almacenados en el mapa. 

Clase HashMap
     HashMap es una implementacion de Map y funciona parecida a las HashTable, es una colección de objetos pero clave-valor. Es decir, para cada objeto que insertas debe existir una clave única. Una HashMap, a diferencia de las HashTable admiten valores nulos tanto en la clave como en el valor.
El nombre HASH, hace referencia a una tecnica de organizacion de archivos llamada hashing o "dispersion" en el cual se almacenan registrso en una direccion del archivo que es generada por una funcion que se aplica sobre la llave del registro.
     Si se observa lo que hace un get(), parecerá bastante lento hacerlo buscando a través de la clave, por ej. de un ArrayList. Es aquí donde un HashMap acelera considerablemente las cosas. En vez de hacer una búsqueda lenta de la clave, usa un valor especial denominado "código de tipo hash". Ésta es una manera de tomar cierta información del objeto en cuestión y convertirlo en un entero "relativamente único" para ese objeto.
     Todos los objetos de Java pueden producir un código de tipo hash, y HashCode() es un método de la clase raíz Object. Un HashMap toma un hashCode() del objeto y lo utiliza para localizar rápidamente la clave. Esto redunda en una mejora dramática de rendimiento.

              // Definir un HashMap
         HashMap global = new HashMap();

         // Insertar valores "key"-"value" al HashMap
        global.put("Doctor", "(+52)-4000-5000");
        global.put("Casa", "(888)-4500-3400");
        global.put("Hermano", "(575)-2042-3233");
        global.put("Hermana", "(421)-1010-0020");
        global.put("Suegros", "(334)-6105-4334");
        global.put("Oficina", "(304)-5205-8454");
        global.put("Ana C.", "(756)-1205-3454");
        global.put("Luis G.", "(55)-9555-3270");
        global.put("Oficina 2", "(874)-2400-8600");
       
        //Uso el StringTokenizer para que cada vez que encuentre una coma haga un salto de línea
        //Sino van a salir los valores en una sola línea separados por coma

StringTokenizer tk = new StringTokenizer(global.toString(), ",");
        while(tk.hasMoreTokens()){
          System.out.println(tk.nextToken());
        }

La interfaz SortedMap


     Es una subinterfaz de la interfaz Map, es un Mapa cuyas claves están ordenadas. Maneja los mismos métodos que la SortedSet, los parámetros de los métodos es referido a las llaves(keys).

La clase TreeMap
     Es una implementacion de SortedMap, utilizando un árbol binario equilibrado que mantiene sus elementos ordenados por clave. Es útil para conjuntos de datos ordenados que requieren una búsqueda por clave moderadamente rápida.

              //Definir un TreeMap
              
TreeMap global = new TreeMap();

         // Insertar valores "key"-"value" al TreeMap
        global.put("Doctor", "(+52)-4000-5000");
        global.put("Casa", "(888)-4500-3400");
        global.put("Hermano", "(575)-2042-3233");
        global.put("Hermana", "(421)-1010-0020");
        global.put("Suegros", "(334)-6105-4334");
        global.put("Oficina", "(304)-5205-8454");
        global.put("Ana C.", "(756)-1205-3454");
        global.put("Luis G.", "(55)-9555-3270");
        global.put("Oficina 2", "(874)-2400-8600");    
       
        //Uso el StringTokenizer para que cada vez que encuentre una coma haga un salto de line
        //Sino van a salir los valores en una sola linea separados por coma

        StringTokenizer tk;
        tk= new StringTokenizer(global.toString(), ",");
        while(tk.hasMoreTokens()){
        System.out.println(tk.nextToken());
        }
       
        System.out.println("--------Metodo subMap--------");
        //Muestra un subMap de A a M
        SortedMap am = global.subMap("A", "M");
      
        tk= new StringTokenizer(am.toString(), ",");
        while(tk.hasMoreTokens()){
        System.out.println(tk.nextToken());
        }      
       
        System.out.println("--------Metodo tailMap--------");
        //Muestra de la letra N en adelante
        SortedMap nz = global.tailMap("N");
        tk= new StringTokenizer(nz.toString(), ",");
        while(tk.hasMoreTokens()){
        System.out.println(tk.nextToken());
        }

No hay comentarios:

Publicar un comentario