Está en la página 1de 12

LAS COLECCIONES EN JAVA

En este apartado vamos a seguir aadiendo cdigo Java, que luego


nos ser de utilidad en la aplicacin Mis Lugares. En concreto vamos
a crear la clase LugaresVector que tiene como finalidad almacenar y
gestionar un conjunto de objetos Lugar de inters para el usuario. La
clase LugaresVector va a utilizar un tipo de coleccin 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 coleccin usaremos la siguiente
estructura:
Coleccion<Clase> nombre = new Coleccion<Clase>();
Donde Coleccion es una clase de este framework que queramos
utilizar segn 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 escribiramos:
ArrayList<String> listaNombres
= new ArrayList<String>();
En Java podemos trabajar con clases genricas, para ello se utiliza <y
>. A este mecanismo se le conoce como genericidad. Para saber ms
sobre este aspecto recomendamos ver el siguiente
Polimedia: http://youtu.be/N3yy2pfUaE0.
Hay tres tipos de colecciones, cada uno con un interfaz comn y
diferentes implementaciones. Las diferentes implementaciones de un
mismo interfaz realizan la misma tarea aunque la diferencia est en
que unas implementaciones son ms rpidas en algunas operaciones
y ms lentas en otras:
Conjunto los elementos no tienen un orden y no se permiten
duplicados.Se define el interfaz Set<E>. Podemos utilizar las
siguientes implementaciones: HashSet<E> (implementacin con
tabla hash),LinkedHashSet<E> (tabla hash +doble lista
enlazada), TreeSet<E> (implementacin con rbol)

Listas estructura secuencial, donde cada elemento tiene un


ndice o posicin. Se utiliza el interfazList<E>. Podemos utilizar las
siguientes implementaciones: ArrayList<E> (acceso
rpido),LinkedList<E>(inserciones/borrado
rpidas), Stack<E> (pila), Vector<E> (obsoleto)
Diccionario o Matriz asociativa cada elemento tiene asociado
una clave que usaremos para recuperarlo. Se utiliza el
interfaz Map<K,V>. Podemos utilizar las siguientes
implementaciones: HashMap<K,V>, TreeMap<K,V>,
LinkedHashMap<K,V>
En el siguiente diagrama se muestra las relaciones de herencia
entre los interfaces y clases ms importantes en el framework de
las colecciones.

Como puede verse en el esquema anterior los


interfaces List<E> y Set<E> heredan del interfaceCollection<E>. A
continuacin se enumeran los mtodos comunes a los
interfaces List<E> y Set<E>, que son recogidos en el

interface Collection. Supondremos que el elemento e es un objeto


de la clase E:
boolean add(E e): Aade 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 coleccin.
void clear(): Elimina todos los elementos de la coleccin.
int size(): Devuelve el nmero de elementos en la
coleccin.
boolean isEmpty(Collection<?> c): Comprueba si la
coleccin est vaca.

Los siguientes mtodos combinan dos colecciones:


boolean addAll(Collection<?> c) : Aade todos los
elementos de la coleccin c.
boolean removeAll(Collection<?> c): Elimina todos los
elementos de la coleccin c.
boolean containsAll(Collection<?> c): Comprueba si
coinciden las colecciones.
boolean retainAll(Collection<?> c): Elimina todos los
elementos a no ser que estn en c. (obtiene la interseccin).

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<E>, que no aade nuevos mtodos a la
interfaz Collection<E>. Por lo tanto, con los mtodos anteriores
podrs manipular tus conjuntos.

Podemos utilizar diferentes implementaciones. La ms eficiente


es HashSet<E> (implementacin con tabla hash). Pero si queremos
que los elementos queden ordenados podemos
usar TreeSet<E> (implementacin con rbol).
El siguiente ejemplo muestra cmo crear un conjunto de Strings y
luego recorrerlo para mostrarlo en consola:

Set<String> 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 coleccin Set<E>

1.

Crea un nuevo proyecto con nombre Colecciones.

2.

Crea una nueva clase con nombre Principal.

3.

Crea el siguiente mtodo en la clase:

public static void main(String[] main) {


}

4. Copia dentro del mtodo el cdigo que se muestra en el


ejemplo anterior.
5. Pulsa Alt-Intro en Android Studio o Shift-CtrlO en Eclipse para que se aadan los import de las clases
utilizadas.
6.

Ejecuta y verifica el resultado.

7. Aade ms 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 alfabtico.
8. Reemplaza en la primera lnea del cdigo 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 alfabtico.
10. Prueba otros mtodos del interface Collection<E>.

LISTAS
Una lista es una estructura secuencial, donde cada elemento tiene un
ndice o posicin. Tambin recibe el nombre de array o vector
unidimensional. El ndice de una lista es siempre un entero y el
primer elemento ocupa la posicin 0. Para trabajar con ellas se
utiliza el interfaz List<E>. Las implementaciones ms recomendables
son: ArrayList<E>si queremos acceder a una posicin de forma muy
rpida oLinkedList<E> si queremos inserciones y borrado muy
rpidos.
La interfaz List<E> hereda todos los mtodos de Collection<E> y
aade los siguientes:
boolean add(int indice, E e): Inserta un nuevo
elemento en una posicin. El elemento que estaba en esta
posicin y los siguientes pararn a la siguiente.
E get(int indice): Devuelve el elemento en la posicin
especificada.

int indexOf(E e): Primera posicin en la que se encuentra


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

List<Complejo> lista = new ArrayList<Complejo>();


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 mtodo add() no se
indica en qu posicin de la lista se inserta. En estos casos se inserta
al final de la lista. La tercera llamada se inserta en la posicin 1, el
elemento en esta posicin y los siguientes son desplazados hacia
atrs.
Como puedes ver la diferencia entre un conjunto y una lista es que en
el conjunto los elementos no tienen una posicin asignada; solo
podemos ver si estn o no estn. Mientras que en la lista los
elementos estn ordenados segn su posicin. Por lo tanto, podemos
insertar, consultar, eliminar o reemplazar elementos de una posicin
determinada.

Practica:La coleccin List<E>

1.

Abre el proyecto Colecciones y adele la clase Complejo.

2. Reemplaza el cdigo del mtodo main() de Principal para


seguir el ejemplo anterior.
3. Pulsa Shift-Ctrl-O para que se aadan los import de las
clases utilizadas.
4.

Prueba otros mtodos del interface List<E>.

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 aade la


clase LugaresVector, y reemplaza el cdigo por el siguiente:

public class LugaresVector implements Lugares {


protected List<Lugar> 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<Lugar> ejemploLugares() {


ArrayList<Lugar> lugares = new ArrayList<Lugar>();
lugares.add(new Lugar("Escuela Politcnica Superior de Ganda",
"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",
"Va Verde del ro 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 Ganda (Valencia)", -0.1720092,
38.9705949, TipoLugar.COMPRAS, 962881070,
"http://www.lavital.es/", "El tpico centro comercial", 2));

return lugares;
}
}
3. Pulsa Alt-Intro e para que se aadan los import de las clases
utilizadas.
import java.util.ArrayList;
import java.util.List;
4. Aade 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 cdigo del
mtodo main() por:

Lugares lugares = new LugaresVector();


for (int i=0; i<lugares.tamanyo(); i++) {
System.out.println(lugares.elemento(i).toString());
}
6.

Verifica que el resultado es similar al siguiente:

DICCIONARIOS
Nota: Este apartado no es imprescindible para el curso. Puedes
saltrtelo.
Los diccionarios (o matrices asociativas) son estructuras de datos
donde cada elemento tiene asociado una clave que usaremos para
recuperarlo (en lugar del ndice de una lista). Para definirlos se utiliza
la interfazMap<K,V>. En este caso se trabaja con dos clases una que
se utiliza como clave (K) y otra para almacenar los valores (V). La
idea es que cada elemento se almacena mediante un par de objetos
(K,V). Esta estructura de datos nos permite obtener el objeto V muy
rpidamente, a partir de su clave K. Por ejemplo, podramos
almacenar objetos de la clase Vehiculo y utilizar como clave su
matrcula en un String. De esta forma, a partir de la matrcula un
diccionario encontrara el vehculo asociado muy rpidamente.
Podemos utilizar las siguientes implementaciones de este
interfaz:HashMap<K,V>,TreeMap<K,V>,LinkedHashMap<K,V>
Veamos los mtodos del interfaz Map<K,V> (Ojo. A diferencia de otras
colecciones no hereda del interfazCollection<E>) ).
V put(K key, V value): Aade un nuevo par clave-valor al
diccionario.
V get(Object key): Da el valor asociado a una clave
o null si no se encontr.
V remove(Object key): Elimina el par clave-valor que
corresponde a la clave.
boolean containsKey(Object key): Comprueba si est la
clave especificada.
boolean containsValue(Object value): Comprueba si est
el valor.
Set keySet(): Devuelve un conjunto con las claves
contenidas en el diccionario.
Collection values(): Devuelve una coleccin con solo los
valores.

boolean isEmpty(): Comprueba si la coleccin est vaca.


int size(): Devuelve el nmero de elementos que contiene
la coleccin.
void clear(): Elimina todos los elementos de la coleccin.

El siguiente ejemplo muestro como crear un diccionario para


almacenar objetos de la clase Vehiculoutilizando como clave
un String con la matrcula:

Map diccionario = new HashMap();


diccionario.put("V 1245", new Vehiculo());
diccionario.put("A 2455", new Vehiculo());
diccionario.get("V 1245");
La clase esttica Collections nos ofrece herramientas para ordenar
y buscar en colecciones. Los
interfacesIterator y ListIterator facilitan recorres colecciones
para hacer bucles.

Enlace de inters:

Si quieres aprender cmo funcionan internamente las estructuras de


datos, te recomendamos ver los siguientes vdeos realizados por
German Molt.