Está en la página 1de 11

Colecciones en Java

Contenido
Documento Ejercitacin Colecciones en Java Fecha de revisin: 19-09-13 Autor: Alejandro Perez Albiero

Virrey del Pino 2166 (C1426EGL) (5411) 4103-2100 Buenos Aires, Argentina

www.finnegans.com.ar

Colecciones en Java Arrays


Los arrays en java, son contenedores de objetos que mantienen un nmero fijo de valores de un solo tipo. La longitude de un array se establece al crearlos, lo que implica que se reserva memoria, y su tamao no puede variar. Al declararlo, definimos el tipo de elementos que puede contener.
// declaramos un array de enteros int[] anArray; // reservamos memoria para 10 enteros anArray = new int[10]; // inicializamos el primer elemento anArray[0] = 100; // inicializamos el segundo elemento anArray[1] = 200; // y los dems anArray[2] = 300; anArray[3] = 400; anArray[4] = 500; anArray[5] = 600; anArray[6] = 700; anArray[7] = 800; anArray[8] = 900; anArray[9] = 1000;

Se pueden armar arrays o matrices de n dimensiones, de cualquier objeto.


//definimos y reservamos memoria para una matriz de 4x5 int[][] totales = new int [4][5];

columns [0][0] rows [1][0] [2][0] [3][0] [0][1] [1][1] [2][1] [3][1] [0][2] [1][2] [2][2] [3][2] [0][3] [1][3] [2][3] [3][3] [0][4] [1][4] [2][4] [3][4]

// inicializamos totales[0] [0] = // inicializamos totales[0] [1] = // y los dems

el primer elemento 100; el segundo elemento 200;

Si queremos alojar cualquier tipo de objeto, tendramos que hacer al array de tipo Object. Por ejemplo, para almacenar 10 objetos Persona: Persona [] personasArray = new Persona[10];

Virrey del Pino 2166 (C1426EGL) (5411) 4103-2100 Buenos Aires, Argentina

www.finnegans.com.ar

Colecciones
Las colecciones son objetos que contienen objetos y que se usan para almacenar, obtener, manipular y comunicar datos incluidos en stas. Normalmente, los objetos includos en ellas suelen ser del mismo tipo, aunque no necesariamente, depende de si son o no genricas. Las colecciones se diferencian de los arrays en que su tamao no es fijo, esto es, son dinmicas. Se pueden realizar operaciones de incluir, eliminar, obtener, encontrar o recorrer una coleccin.

Java Collections Framework


La Java Collections Framework (JCF) est constituda por sus interfaces (las ms importantes List, Set y Map), interfaces de soporte (Iterator, ListIterator, Comparable y Comparator) y de clases de distintos usos, es decir, las implementaciones de las interfaces, y que sirven para almacenar y manipular grupos de datos como una sola unidad, como una coleccin (HashSet, TreeSet, ArrayList, LinkedList, HashMap, TreeMap, etc.). Tambin hay clases abstractas que tienen total o parcialmente implementados los mtodos de la interface correspondiente, y que sirven para que los usuarios deriven de ellas sus propias clases de forma ms sencilla.

Las interfases Collection y Map son las padres de las interfases en el Framework de colecciones de Java. Es notorio que la jerarqua consta de dos diferentes rboles. Dos clases que implementan la misma interface se pueden utilizar exactamente de la misma forma, aunque difieran en cuanto a la implementacin y, por tanto, su eficiencia.

Colecciones Genricas
Hay que tomar en cuenta que las interfaces son genricas, public interface Collection<E> ... La sintaxis <E> indica que es una interface genrica. Cuando se declara una instancia de Collection, se puede especificar el tipo de objeto que esta va a contener. Esto permite que el compilador verifique el tipo de objeto que se va a poner dentro de la coleccin sea el indicado (compile-time), lo cual reduce el nmero de errores en tiempo de ejecucin (runtime).

Uso (o no) de valores genricos


Para utilizar una lista, podemos no utilizar genricos (esto es, no definir el tipo de objetos que debe contener la lista): List lista = new ArrayList(); ...y para aadir: lista.add(new Alumno()); //aadimos un tipo Alumno lista.add(new String()); // aadimos un tipo String

Virrey del Pino 2166 (C1426EGL) (5411) 4103-2100 Buenos Aires, Argentina

www.finnegans.com.ar

...si queremos saber el valor de la posicin cero: Object o = lista.get(0); Alumno al = (Alumno)o; Si utilizamos con genricos: List<Alumno> lista = new ArrayList<Alumno>(); donde slo podremos incluir y obtener objetos de tipo Alumno. Con lo que ante la instruccin de incluir un objeto de tipo String en esta lista nos dara un error de compilacin: lista.add(new String); //nos dara error lista.add(alumno2); //sera correcto ...tampoco habra que hacer un casting si queremos obtener un determinado objeto de la lista: Alumno al = lista.get(0);

Mediante una lista sin Generics


Si queremos recorrer una lista genrica, se puede hacer con un bucle for each: for(Object obj: lista){ System.out.println(obj); }

Mediante una lista con Generics


for(Alumno al: lista){ System.out(al.getNombre()); }

Interfaces de JCF
Vamos a analizar las interfaces ms importantes de la JCF:

Interface List
Se encarga de definir mtodos para trabajar con colacciones ordenadas y con elementos repetidos. Algunos de los mtodos de la interface List son los siguientes: add(Object o): aade un objeto al final de la lista. add(int indice, Object o): aade un objeto a la lista en la posicin indicada. get(int indice): devuelve el objeto de la lista de la posicin indicada. remove(int indice): elimina el objeto de la lista pasado por parmetro. clear(): elimina todos los elementos de la lista. indexOf(Object o): devuelve la posicin de la primera vez que un elemento coincida con el objeto pasado por parmetro. Si el elemento no se encuentra devuelve -1. lastIndexOf(Object o):devuelve la posicin de la ltima vez que un elemento coincida con el objeto pasado por parmetro. Si el elemento no se encuentra devuelve -1. size(): devuelve el nmero de elementos de la lista. contains(Object o): devuelve verdadero si en la lista aparece el objeto pasado por parmetro, para lo cual utiliza intrnsecamente el mtodo equals(). Existen implementaciones de la interface List, como son las clases ArrayList y LinkedList. Hay otras dos que no voy a comentar: Vector(h) y Stack(h). ArrayList se basa en ndices, siendo cero la posicin inicial e infinito su posicin final, o lo que es lo mismo, contiene tantos objetos como necesitemos, almacenando los elementos en un array de objetos. Esta clase
Virrey del Pino 2166 (C1426EGL) (5411) 4103-2100 Buenos Aires, Argentina www.finnegans.com.ar

tiene varios constructores, siendo la ms importante el ArrayList(), que construye un ArrayList con capacidad cero por defecto pero con infinitos objectos a insertar. Si le queremos dar un tamao empleamos el constructor ArrayList(int numElementos). ArrayList implementa la interface List y extiende de la clase abstracta AbstractList. LinkedList almacena los elementos en una lista vinculada y permiten un acceso a ella de manera secuencial, pero su uso no es tan eficiente como los arrays.

Interfaces Set<E> y SortedSet<E>


Sirve para acceder a una coleccin sin elementos repetidos (hay que saber cundo dos objetos son considerados iguales; para ello se usan equals() y hashcode();). Puede estar o no ordenada, y no declara ningn mtodo adicional a los de Collection. Algunos de los mtodos de la interface Set son los siguientes: add(Object o): aade el objeto pasado por parmetro al Set siempre que ste no exista ya, y devuelve un booleano. clear(): Elimina a todos los elementos del Set. contains(Object o): devuelve true si el Set contiene el objeto pasado por parmetro. Para ello, se compara de forma interna con el mtodo equals (o.equals(x);) o con el mtodo hashCode(). isEmpty(): devuelve true si el Set est vaco. iterator(): devuelve un iterador remove(Object o): elimina el objeto pasado por parmetro si existe y devuelve un booleano. size(): devuelve un entero que es el nmero de elementos del Set. La interface SortedSet extiende de la interface Set y aade una serie de mtodos, entre los que hay que destacar: comparator(): obtiene el objeto pasado al constructor para establecer el orden; si se emplea el orden natural definido por la interface Comparable, devuelve null; first() / last(): devuelve el primer o el ltimo elemento del conjunto. Existen dos implementaciones de conjuntos, como son la clase HashSet y la clase TreeSet.

HashSet<Elemento>
Implementa la inteface Set y est basada en una hash table. Hace distincin de identidad, esto es, que slo pueden existir elementos diferentes (nada de duplicados). No se respeta el orden en el que se insertan los elementos y el tamao del conjunto se adapta dinmicamente a lo que se necesite. HashSet implementa la interface Set y extiende de la clase abstracta AbstractSet.

TreeSet<Elemento>
Implementa SortedSet y se basa en un TreeMap.

Interfaces Map<Clave, Valor> y SortedMap<Clave, Valor>


Un Map es una estructura de datos agrupados en parejas clave/valor; pueden ser considerados como una tabla de dos columnas. La clave debe ser nica y se emplea para acceder al valor. Map no deriva de Collection, pero s se pueden ver los Maps como colecciones de claves, de valores o de claves/valores. Algunos de los mtodos de la interface Map son los siguientes: clear(): elimina todos los mapeos del Map. containsKey(Object clave): devuelve true si el Map contiene un mapeo igual que el objeto pasado por parmetro: boolean existe = productos.containsKey(producto); containsValue(Object valor): devuelve true si el Map mapea a uno o ms claves del objeto valor pasado por parmetro. get(Object clave): devuelve el objeto valor de la clave pasada por parmetro; o null si el Map no encuentra ningn mapeo con esta clave. isEmpty(): devuelve true si el Map est vaco. put(Clave clave, Valor valor): asigna el valor pasado con la clave especificada a otro objeto valor. remove(Object clave): elimina el mapeo que tenga la clave pasada por parmetro si existe, devolviendo el valor de dicho mapeo. size(): devuelve un entero con el nmero de mapeos del Map. La interface SortedMap aade mtodos similares a los de SortedSet.
Virrey del Pino 2166 (C1426EGL) (5411) 4103-2100 Buenos Aires, Argentina www.finnegans.com.ar

Existen tres implementaciones como son las clases HashMap, HashTable(h) y TreeMap.

HashMap<Clave,Valor>
esta clase mapea claves con valores, pero no permite claves duplicadas porque se solapara el valor. Tanto la clave como el valor pueden ser cualquier tipo de objeto, y ambos pueden tener el valor null. Esta clase no garantiza el orden de los elementos ni que no puedan cambiar de orden. HashMap implementa la interface Map y extiende de la clase abstracta AbstractMap. Esta clase posee internamente (de la clase AbstractMap) los mtodos equals, hashCode y toString.

HashTable<Clave,Valor>
Es una clase que implementa Map y que almacena pares del tipo clave/valor en una tabla de dispersin. Al emplearla se proporciona un objeto que sirve como clave y otro como valor (vinculando el valor a la clave).Su insercion y bsqueda es rpida. Un ejemplo sera un listn de telfonos, en el que dado un nombre se proporciona un telfono.

TreeMap<Clave,Valor>
Esta clase implementa SortedMap y se basa en una rbol binario.

Virrey del Pino 2166 (C1426EGL) (5411) 4103-2100 Buenos Aires, Argentina

www.finnegans.com.ar

Ordenamiento de Listas Interface Comparable


Comparable declara el mtodo compareTo() que compara a la propia instancia con el que se le pasa por parmetro, devolviendo -1, 0 1 segn el argumento sea anterior, igual o posterior al parmetro: public int compareTo(Object o);

Interface Comparator
Comparator permite ordenar listas y colecciones cuyos objetos pertenecen a clases de cualquier tipo. La idea es parecida a la de Comparable, pero el usuario debe proporcionar la implementacin de la interface. Esta interface declara los mtodos equals(),y compare(). int compare(T o1, T o2)
Compara sus 2 argumentos para comparar, que devuelve -1, 0 1 segn el argumento sea anterior, igual o posterior al Segundo.

Boolean

equals(Object obj)
Devuelve true cuando otro objeto obj, es igual a este Comparator

Virrey del Pino 2166 (C1426EGL) (5411) 4103-2100 Buenos Aires, Argentina

www.finnegans.com.ar

java.util.Collections
La clase java.util.Collections, nos sirve para, entre otras cosas, realizar ordenamientos. Collections.sort(Collection) Nos permite ordenar una lista de objetos que implementen la interface Comparable, o pasndole una clase que implemente la interface Comparator.

Ordenar implementando Comparable


Esta interface define el mtodo compare que realiza la comparacin de 2 elementos, devuelve -1, 0 1 segn el argumento sea anterior, igual o posterior al elemento comparado.

La clase Integer implementa dicha interface, por lo que podemos usarla directamente.
import java.util.ArrayList; import java.util.Collections; import java.util.List; public class Simple { public static void main(String[] args) { List list = new ArrayList(); list.add(5); list.add(4); list.add(3); list.add(7); list.add(2); list.add(1); Collections.sort(list); for (Integer integer : list) { System.out.println(integer); } } }

Virrey del Pino 2166 (C1426EGL) (5411) 4103-2100 Buenos Aires, Argentina

www.finnegans.com.ar

Si quisiramos implementar Comparable en una clase cualquiera nuestra, deberamos implementar el mtodo compareTo propuesto por dicha inteface:

public class Empleado implements Comparable<Persona>{ private String nombre; private Integer edad; private Integer antiguedad; public Empleado(String nombre, Integer edad, Integer antiguedad) { this.nombre = nombre; this.edad = edad; this.antiguedad = antigedad; }

public Integer getEdad() { return this.edad; } public void setEdad(Integer edad) { this.edad = edad; } public Integer getAntiguedad() { return this.antiguedad; } public void setAntiguedad(Integer antiguedad) { this.antiguedad = antiguedad; } @Override public int compareTo(Empleado arg0) { return getEdad().compareTo(arg0.getEdad()); } @Override public String toString() { return "Empleado [getNombre()=" + getNombre() + ", getEdad()=" + getEdad() + ", getAntiguedad()=" + getAntiguedad() + "]"; } }

Virrey del Pino 2166 (C1426EGL) (5411) 4103-2100 Buenos Aires, Argentina

www.finnegans.com.ar

La clase Collections, para ordenar, internamente llama al mtodo compareTo de los objetos contenidos en la lista. Podemos probarlo de la siguiente manera:
import java.util.ArrayList; import java.util.Collections; import java.util.List; public class Simple { public static void main(String[] args) { List<Empleado> list = new ArrayList<Empleado>(); list.add(new Empleado(Juan Perez, 24, 3)); list.add(new Empleado(Anibal Martinez, 36, 8)); list.add(new Empleado(Analia Lopez, 36, 5)); list.add(new Empleado(Fernando Miranda, 28, 5)); Collections.sort(list); for (Empleado empleado : list) { System.out.println(empleado); } } }

Virrey del Pino 2166 (C1426EGL) (5411) 4103-2100 Buenos Aires, Argentina

www.finnegans.com.ar

Ordenar Implementando Comparator<E>


Si quisieramos ordenar de otra manera a la propuesta por la propia clase Integer, podramos definir nosotros una implementacin de la interface Comparator<Integer>. Otra forma, quizs ms molesta, sera heredar de la clase Integer, y sobreescribir el mtodo compareTo(Integer int) definido por la interface Comparable<Integer> para modificar su comportamiento.
import java.util.Comparator; public class MyIntComparator implements Comparator<Integer>{

@Override
public int compare(Integer o1, Integer o2) { return (o1>o2 ? -1 : (o1==o2 ? 0 : 1)); } }

Collections.sort, al pasarle como parmetro una implementacin de Comparator, utiliza esta ltima instancia para comparar en lugar de utilizar el mtodo compareTo de los objetos contenidos en la lista. Podemos probar este nuevo ordenamiento de la siguiente forma:
import java.util.ArrayList; import java.util.Collections; import java.util.List; public class Simple2 { public static void main(String[] args) { List<Integer> list = new ArrayList<Integer>(); list.add(5); list.add(4); list.add(3); list.add(7); list.add(2); list.add(1); Collections.sort(list, new MyIntComparator()); for (Integer integer : list) { System.out.println(integer); } } }

Referencias:
http://mathbits.com/MathBits/Java/arrays/Matrices.htm http://vayajava.blogspot.com.ar/search/label/Colecciones http://www.vogella.com/articles/JavaCollections/article.html#collectionssort

Virrey del Pino 2166 (C1426EGL) (5411) 4103-2100 Buenos Aires, Argentina

www.finnegans.com.ar

También podría gustarte