Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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
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]
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.
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).
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);
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.
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.
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
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.
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
@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