13 Colecciones en Java

LAS COLECCIONES EN JAVA En este apartado vamos a seguir añadiendo código Java, que luego nos será de utilidad en la apli

Views 87 Downloads 0 File size 190KB

Report DMCA / Copyright

DOWNLOAD FILE

Recommend stories

Citation preview

LAS COLECCIONES EN JAVA En este apartado vamos a seguir añadiendo código Java, que luego nos será de utilidad en la aplicación Mis Lugares. En concreto vamos a crear la clase LugaresVector que tiene como finalidad almacenar y gestionar un conjunto de objetos Lugar de interés para el usuario. La clase LugaresVector va a utilizar un tipo de colección para almacenar los lugares. Antes de comenzar, es interesante introducir la poderosa herramienta que nos ofrece las colecciones.

LAS COLECCIONES EN JAVA El API de Java nos proporciona el framework de las colecciones, que nos permite utilizar diferentes estructuras de datos para almacenar y recuperar objetos de cualquier clase. Dichas colecciones no forman parte del lenguaje, sino que son clases definidas en el paquete java.util. Para definir una colección usaremos la siguiente estructura: Coleccion nombre = new Coleccion(); Donde Coleccion es una clase de este framework que queramos utilizar según la estructura de almacenamiento que nos interese y Clase representa el tipo de datos a almacenar. Por ejemplo, para crear una lista ordenada de objetos de la clase String escribiríamos: ArrayList listaNombres = new ArrayList(); En Java podemos trabajar con clases genéricas, para ello se utiliza . A este mecanismo se le conoce como genericidad. Para saber más sobre este aspecto recomendamos ver el siguiente Polimedia: http://youtu.be/N3yy2pfUaE0. Hay tres tipos de colecciones, cada uno con un interfaz común y diferentes implementaciones. Las diferentes implementaciones de un mismo interfaz realizan la misma tarea aunque la diferencia está en que unas implementaciones son más rápidas en algunas operaciones y más lentas en otras: Conjunto – los elementos no tienen un orden y no se permiten duplicados.Se define el interfaz Set. Podemos utilizar las siguientes implementaciones: HashSet (implementación con tabla hash),LinkedHashSet (tabla hash +doble lista enlazada), TreeSet (implementación con árbol)

Listas – estructura secuencial, donde cada elemento tiene un índice o posición. Se utiliza el interfazList. Podemos utilizar las siguientes implementaciones: ArrayList (acceso rápido),LinkedList(inserciones/borrado rápidas), Stack (pila), Vector (obsoleto) Diccionario o Matriz asociativa – cada elemento tiene asociado una clave que usaremos para recuperarlo. Se utiliza el interfaz Map. Podemos utilizar las siguientes implementaciones: HashMap, TreeMap, LinkedHashMap En el siguiente diagrama se muestra las relaciones de herencia entre los interfaces y clases más importantes en el framework de las colecciones.

Como puede verse en el esquema anterior los interfaces List y Set heredan del interfaceCollection. A continuación se enumeran los métodos comunes a los interfaces List y Set, que son recogidos en el

interface Collection. Supondremos que el elemento e es un objeto de la clase E: boolean add(E e): Añade un nuevo elemento al final de la lista. boolean remove(E e): Elimina la primera ocurrencia del elemento indicado. boolean contains(E e): Comprueba si el elemento especificado está en la colección. void clear(): Elimina todos los elementos de la colección. int size(): Devuelve el número de elementos en la colección. boolean isEmpty(Collection c): Comprueba si la colección está vacía.

Los siguientes métodos combinan dos colecciones: boolean addAll(Collection c) : Añade todos los elementos de la colección c. boolean removeAll(Collection c): Elimina todos los elementos de la colección c. boolean containsAll(Collection c): Comprueba si coinciden las colecciones. boolean retainAll(Collection c): Elimina todos los elementos a no ser que estén en c. (obtiene la intersección).

CONJUNTOS Los conjuntos son estructuras de datos donde los elementos no tienen un orden y no se permiten duplicados. Para definirlos se utiliza la interfaz Set, que no añade nuevos métodos a la interfaz Collection. Por lo tanto, con los métodos anteriores podrás manipular tus conjuntos.

Podemos utilizar diferentes implementaciones. La más eficiente es HashSet (implementación con tabla hash). Pero si queremos que los elementos queden ordenados podemos usar TreeSet (implementación con árbol). El siguiente ejemplo muestra cómo crear un conjunto de Strings y luego recorrerlo para mostrarlo en consola:

Set conjunto = new HashSet(); conjunto.add("manzana"); conjunto.add("pera"); conjunto.add("fresa"); conjunto.add("naranja"); conjunto.remove("pera"); for(String s : conjunto) { System.out.println(s); }

Ejercicio paso a paso: La colección Set

1.

Crea un nuevo proyecto con nombre Colecciones.

2.

Crea una nueva clase con nombre Principal.

3.

Crea el siguiente método en la clase:

public static void main(String[] main) { }

4. Copia dentro del método el código que se muestra en el ejemplo anterior. 5. Pulsa Alt-Intro en Android Studio o Shift-CtrlO en Eclipse para que se añadan los import de las clases utilizadas. 6.

Ejecuta y verifica el resultado.

7. Añade más elementos al conjunto, alguno dos veces y vuelve a ejecutar. Has de observar como el orden en que se muestra los elementos del conjunto no coincide con el orden en que son insertados ni con el orden alfabético. 8. Reemplaza en la primera línea del código la clase que usamos para implementar el conjunto; en lugar de HashSet introduce TreeSet. 9. Pulsa Alt-Intro en Android Studio o Shift-CtrlO en Eclipse y ejecuta de nuevo. Observar como ahora se muestran los elementos en orden alfabético. 10. Prueba otros métodos del interface Collection.

LISTAS Una lista es una estructura secuencial, donde cada elemento tiene un índice o posición. También recibe el nombre de array o vector unidimensional. El índice de una lista es siempre un entero y el primer elemento ocupa la posición 0. Para trabajar con ellas se utiliza el interfaz List. Las implementaciones más recomendables son: ArrayListsi queremos acceder a una posición de forma muy rápida oLinkedList si queremos inserciones y borrado muy rápidos. La interfaz List hereda todos los métodos de Collection y añade los siguientes: boolean add(int indice, E e): Inserta un nuevo elemento en una posición. El elemento que estaba en esta posición y los siguientes pararán a la siguiente. E get(int indice): Devuelve el elemento en la posición especificada.

int indexOf(E e): Primera posición en la que se encuentra un elemento; -1 si no está. int lastIndexOf(E e): Última posición del el elemento especificado; o -1 si no está. E remove(int indice): Elimina el elemento de la posición indicada. E set(int indice, E e): Pone un nuevo elemento en la posición indicada. Devuelve el elemento que se encontraba en dicha posición anteriormente. El siguiente ejemplo muestra como crear una lista de complejos y luego recorrerla:

List lista = new ArrayList(); lista.add( new Complejo(1.0, 5.0) ); lista.add( new Complejo(2.0, 4.2) ); lista.add(1, new Complejo(3.0, 0.0) );lista.remove(0); for(Complejo c: lista) { System.out.println(c); } Observa como las dos primeras llamadas al método add() no se indica en qué posición de la lista se inserta. En estos casos se inserta al final de la lista. La tercera llamada se inserta en la posición 1, el elemento en esta posición y los siguientes son desplazados hacia atrás. Como puedes ver la diferencia entre un conjunto y una lista es que en el conjunto los elementos no tienen una posición asignada; solo podemos ver si están o no están. Mientras que en la lista los elementos están ordenados según su posición. Por lo tanto, podemos insertar, consultar, eliminar o reemplazar elementos de una posición determinada.

Practica:La colección List

1.

Abre el proyecto Colecciones y añádele la clase Complejo.

2. Reemplaza el código del método main() de Principal para seguir el ejemplo anterior. 3. Pulsa Shift-Ctrl-O para que se añadan los import de las clases utilizadas. 4.

Prueba otros métodos del interface List.

Ejercicio paso a paso: La clase LugaresVector

En este ejercicio vamos a crear la clase LugaresVector que tiene como finalidad almacenar y gestionar un conjunto de objetos Lugar dentro de un vector. 1.

Abre el proyecto Mis Lugares Java.

2. Dentro del paquete org.example.mislugares añade la clase LugaresVector, y reemplaza el código por el siguiente:

public class LugaresVector implements Lugares { protected List vectorLugares = ejemploLugares();

public LugaresVector() { vectorLugares = ejemploLugares(); }

public Lugar elemento(int id) { return vectorLugares.get(id);

}

public void anyade(Lugar lugar) { vectorLugares.add(lugar); }

public int nuevo() { Lugar lugar = new Lugar(); vectorLugares.add(lugar); return vectorLugares.size()-1; }

public void borrar(int id) { vectorLugares.remove(id); }

public int tamanyo() { return vectorLugares.size(); }

public void actualizar(int id, Lugar lugar) { vectorLugares.set(id, lugar); }

public static ArrayList ejemploLugares() { ArrayList lugares = new ArrayList(); lugares.add(new Lugar("Escuela Politécnica Superior de Gandía", "C/ Paranimf, 1 46730 Gandia (SPAIN)", -0.166093, 38.995656, TipoLugar.EDUCACION, 962849300, "http://www.epsg.upv.es", "Uno de los mejores lugares para formarse.", 3)); lugares.add(new Lugar("Al de siempre", "P.Industrial Junto Molí Nou - 46722, Benifla (Valencia)", -0.190642, 38.925857, TipoLugar.BAR, 636472405, "", "No te pierdas el arroz en calabaza.", 3)); lugares.add(new Lugar("androidcurso.com", "ciberespacio", 0.0, 0.0, TipoLugar.EDUCACION, 962849300, "http://androidcurso.com", "Amplia tus conocimientos sobre Android.", 5)); lugares.add(new Lugar("Barranco del Infierno", "Vía Verde del río Serpis. Villalonga (Valencia)", -0.295058, 38.867180, TipoLugar.NATURALEZA, 0, "http://sosegaos.blogspot.com.es/2009/02/lorcha-villalongavia-"+ "verde-del-rio.html","Espectacular ruta para bici o andar", 4)); lugares.add(new Lugar("La Vital", "Avda. de La Vital, 0 46701 Gandía (Valencia)", -0.1720092, 38.9705949, TipoLugar.COMPRAS, 962881070, "http://www.lavital.es/", "El típico centro comercial", 2));

return lugares; } } 3. Pulsa Alt-Intro e para que se añadan los import de las clases utilizadas. import java.util.ArrayList; import java.util.List; 4. Añade la siguiente sobrecarga al constructor a la clase Lugar:

public Lugar() { fecha = System.currentTimeMillis(); posicion = new GeoPunto(0,0); tipo = TipoLugar.OTROS; } Esto nos permitirá crear un nuevo lugar sin indicar sus atributos. 5. Abre la clase Principal y reemplaza el código del método main() por:

Lugares lugares = new LugaresVector(); for (int i=0; i