lunes, 30 de junio de 2014

MODULO 9: Colecciones
Una colección es la representación de un objeto que administra o maneja un conjunto de objetos conocidos como elementos.

Las colecciones representan estructuras de datos con cierta implementación (Arboles, Pilas, Listas, Colas).

Los arreglos son estáticos.

asList

public static <T> List<T> asList(T... a)
Returns a fixed-size list backed by the specified array. (Changes to the returned list "write through" to the array.) This method acts as bridge between array-based and collection-based APIs, in combination withCollection.toArray(). The returned list is serializable and implements RandomAccess.This method also provides a convenient way to create a fixed-size list initialized to contain several elements:
     List<String> stooges = Arrays.asList("Larry", "Moe", "Curly");
Parameters:
a - the array by which the list will be backed
Returns:
a list view of the specified array
Cuando se convierte un arrays (que son estático) a una lista, ya no se pueden agregar más puesto que son estáticos
public class TestArrays {
 
    public static void main(String[] args) {
        String [] sa = {"Rojo", "Naranja", "Verde", "Blanco", "Azul"};
     
        List sl = Arrays.asList(sa);
        sa[0]="Amarillo";
        sl.add("Rosa");   // Error porque los array son estáticos aun cuando las listas no lo son.
        for (String s : sa) {
            System.out.println(" "+s);
        }
        System.out.println("sa= "+sa);
        System.out.println("sl = "+sl);
     
    }
 
}


Arrays.sort(sa);
        int a = Arrays.binarySearch(sa, "Aaa");

La búsqueda binaria regresa la posición en donde se encuentra siempre y cuando se encuentre (Se recomienda que este ordenado para un mejor funcionamiento) en caso de que no lo encuentre nos trae el valor de la posición donde debería estar -1.

Colecciones
al.set(0, "Robben");
al.add(0, "Marquez");

set: Set reemplaza lo que hay en esa determinada posición.
add: inserta en la posición específica y recorre lo que hay ahí.

List al = new ArrayList();
       
        al.add(0, "Marquez");
        al.set(0, "Robben");
        al.add(0, "Marquez");
        
        System.out.println(""+al);

--- Output ---
[Marquez, Robben]


Si ponemos primero set en el primer add marcaría error porque el set reemplaza y si esta vacío, no hay nada que reemplzar.

Listas doblemente Ligada
peeak - regresa el primier elemento pero no lo elimina.
poll: - regresa el primer elemento y lo elimina.

Ejemplo de uso
public class TestLLL {
    public static void main(String[] args) {
        LinkedList ll = new LinkedList();
        ll.add("Manzana");
        ll.add("Mango");
        ll.add("Uva");
        ll.add("Fresa");
        ll.add("Pera");
        ll.add("Uva");
        System.out.println(""+ll);
        ll.peek();
        ll.poll();
        
        System.out.println("" + ll.poll());
        System.out.println(""+ll);
    }  
}

-- Output --
[Manzana, Mango, Uva, Fresa, Pera, Uva]
Mango
[Uva, Fresa, Pera, Uva]

Clase set
public class TestHS {
    public static void main(String[] args) {
        Set hs = new HashSet();
        
        hs.add(15);
        hs.add(2);
        hs.add(3);
        hs.add(3); //No permite repetidos pero si compila, pero al mostrarlo no lo muestra
        hs.add(78);
        hs.add(1);
        
        System.out.println(""+hs); //No los ordena 
        
    }
}

Este método utiliza el método equals.

TreeSet
Son ordenados, no duplicados.


Colas con prioridad
Es como un árbol que va buscando el balance, en caso de que el hijo sea menor que el padre, el padre le deja el lugar al hijo y el padre toma el lugar que el hijo.

Empieza de izquierda a derecha.
si tenemos 5, 8 ,23, 2, 8
El árbol sería de la siguiente forma

                   2
                   ^
             5       23
             ^
          8     8


Ejemplo
package EjCPQ;

import java.util.PriorityQueue;

public class EjPQ {
    public static void main(String[] args) {
        PriorityQueue pq = new PriorityQueue();
        pq.add(5);
        pq.add(8);
        pq.add(23);
        pq.add(2);
        pq.add(8);
        pq.add(8);
        pq.poll(); //Elimina el elemento padre, en este caso luego de la eliminación se recorren los elementos
        pq.peek(); //Sól muestra el valor del padre principal.
        pq.poll();
       
        System.out.println(""+pq);
    }
}

-- output --
[8, 8, 8, 23]

Interfaz MAP
Similares a las colecciones (es una colección pero no extiende de colecctions) pero permiten tener clave, valor, la clave es única. Sirven como diccionarios.
LOS MAPAS NO EXTIENDEN DE COLECCIONES POR LO TANTO NO TIENEN EL MÉTODO ADD

NO ORDENA, sin embargo casi salen ordenados porque los acomoda de tal forma que los va comparando para no aceptar claves repetidas.

Pero tiene otros métodos:
  - put(k,v):  Sirve como el add en las colecciones, se ingresa la clave + valor, las llaves no son repetidas            pero los valores pueden ser repetidos.
  - 

Ejemplos de la interfaz map<k,q>

package EjIM;

import java.util.HashMap;
import java.util.Set;
import java.util.TreeSet;

public class TestM {
    public static void main(String[] args) {
        HashMap ma = new HashMap();
        ma.put("uno", 12);
        ma.put("cinco", 54);
        ma.put("tres", 23);
        ma.put("uno", 84); //esta clave esta duplicada, pero este valor (84) actualiza al 12 que ya estaba
                                    // porque no acepta claves duplicados, solo actualiza
        ma.put(null, 12);   //en algunas implementaciones acepta llaves NULAS        


        Set s =  ma.keySet(); //el método keySet() regresa el conjunto de llaves dentro del mapa
                                         // y como regresa un set pues por eso el s de tipo Set.
Collection tv =  ma.values(); //obtenemos los valores
        
        System.out.println(""+ma); 
        System.out.println(""+s);
        System.out.println(""+tv);

//#        

    }
}
-- output --
ma_ {null=12, tres=23, cinco=54, uno=84}
s_ [null, tres, cinco, uno]
tv_ [12, 23, 54, 84]

TreeMap
La diferencia con treeSet es la forma en como compara y ordena los numeros, los treeSet NO ordena los numeros y permite arboles balanceados, en el caso de los treeMap si ordena las claves. 

Ejemplo:

Si en //# agregamos los siguientes

TreeMap tm = new TreeMap();
        //Los treeMap es parecido al treeSet
        tm.put(1, "ferrari");
       // tm.put(null, "bocho"); //Error. Los arboles no permiten claves nulas
        tm.put(45, "nissan");
        tm.put(2, "ford");
        tm.put(6, "mercedez");
        tm.put(14, "combi");
        
        System.out.println("tm_ "+tm);

-- output --
ma_ {null=12, tres=23, cinco=54, uno=84}
s_ [null, tres, cinco, uno]
tv_ [12, 23, 54, 84]
tm_ {1=ferrari, 2=ford, 6=combi, 45=nissan}  //Se puede ver que estar ordenados por clave

Comparable vs Comparator




Genericos
habilidad de crear una clase donde el usuario final puede decidir de que tipo de dato quiere trabajar.

Así se define una clase generica, donde el usuario decide que tipo de dato.
package Genericos;
public class MiGenerica<T> {
    
}

También se puede hacer lo siguiente
public class MiGenerica<T,E> {} //Se definen dos tipos de datos.

... continuando con el ejemplo

package Genericos;


public class MiGenerica<T> {
    private T variable;
    public T m(T j){
        return j;
    }
}

package Genericos;

import java.util.ArrayList;
import java.util.List;


public class TestGen {
    public static void main(String[] args) {
        MiGenerica<String> mg = new MiGenerica<String>();
        
        List<Integer> l = new ArrayList<Integer>();
        l.add(34);
        
    }
   
}

En Genéricos vienen los conceptos 
      Invarianza
      Covarianza
      Contravarianza 


Estudiar Para los Simuladores
método hasCode
interfaces y clases con metodos largos (asfnsk{ sd fs};)
para que sirve el write de archivos
DateFormat (dayFormat existe ?, getDay ?)
No puede iniciar dos hilos vivos t.star(); t.start(); //error en tiempo de ejecución
si se pone un ; solo es correcto