Академический Документы
Профессиональный Документы
Культура Документы
Colecciones
5.1
Introduccin
5.2
Definicin
5.3
Jerarqua Collection
La interfaz Collection define la forma general como se comportan todas las colecciones
que de ella se derivan y que hacen mucho ms fcil la elaboracin de los programas,
pues slo debe conocerse el encabezado del mtodo para utilizarlo, aunque internamente
cada clase de la jerarqua implemente el servicio de manera diferente.
En esta interfaz se definen los mtodos bsicos de toda coleccin, entre los cuales se
encuentran:
boolean add(Object): Permite adicionar un objeto a la coleccin. Observe que se
recibe un parmetro de tipo Object, es decir, cualquier objeto puede guardarse en una
coleccin, pero no tipos bsicos. Este mtodo retorna true cuando el objeto se pudo
adicionar exitosamente a la coleccin.
No todas las colecciones de la jerarqua permiten realizar todas las operaciones definidas
en la interfaz Collection (o en Map, como se ver ms adelante). Si alguna operacin no
es permitida se lanza una java.lang.UnsupportedOperationException.
Preguntas
Las listas son agrupaciones de objetos que cuentan con las siguientes caractersticas:
- Los elementos se encuentran organizados uno despus de otro (en secuencia).
- Es posible conocer en cualquier momento la posicin donde est ubicado un elemento
dentro de la lista.
- Permite elementos repetidos.
- No se requiere que los elementos almacenados se encuentren ordenados por algn
criterio particular.
Dado que una lista permite elementos repetidos, no se realiza ninguna verificacin al
momento de adicionar un objeto. Una lista, por lo tanto, es til cuando no hay necesidad
de identificar de manera nica los elementos.
Como se observa en la figura 10, la interfaz List, adems de los mtodos que hereda de
Collection, define, entre otros, los siguientes mtodos:
add(int, Object): Adiciona un objeto en la posicin indicada en la lista (desplazando los
elementos posteriores a esta posicin, hacia la derecha).
Object remove(int): Retira el objeto que hay en la posicin dada, y retorna una
referencia a este.
int indexOf(Object): Busca el objeto en la coleccin y retorna la posicin de su primera
aparicin. Si el elemento no est en la coleccin retorna 1.
Object get(int): Retorna una referencia al objeto que se encuentra en la posicin que
se da en el parmetro.
ListIterator listIterator(): Retorna un objeto ListIterator asociado a la lista. Esta interfaz
se explica posteriormente.
ListIterator listIterator(int): Retorna un objeto ListIterator que comienza en la posicin
indicada.
Puede observarse que la interfaz List define mtodos que permiten adicionar, eliminar u
obtener una referencia a un objeto a travs de su posicin. Sin embargo, estos mtodos
no siempre son eficientes, y en su lugar se recomienda recorrer la lista utilizando un
iterador.
5.3.1.2 Clase AbstractList
Esta clase, de tipo abstracto, implementa a la interfaz List, y define cierta funcionalidad
bsica para las clases que hereden de ella, es decir, ya contiene el cdigo para algunos
de los mtodos definidos en List. Es especialmente til cuando se requiere elaborar una
coleccin propia con el comportamiento de una lista, en cuyo caso la coleccin hereda de
AbstractList , evitando el tener que implementar directamente a la interfaz List.
Pregunta:
Cules son los mtodos cuyo cdigo ya fue elaborado en la clase AbstracList?
continuacin
if (posicin != -1){
Libro vendido=libros.get(posicin);
libros.remove(vendido);
return vendido;
}
return null;
}
public static void main (String args[ ]){
.
Libro libro=venderLibro(ttulo);
if (libro!=null){
System.out.println(Libro vendido);
else
System.out.println(El libro no se encuentra disponible);
}
}
5.3.1.4 LinkedList
Esta clase, de tipo concreto, hereda de la clase AbstractSequentialList, que implementa a
la interfaz List. Las colecciones de tipo LinkedList ocupan espacios diferentes de la
memoria por cada objeto que all se almacena, de manera que cada elemento encadena
a su sucesor y antecesor para mantener la lista. Esta forma de implementacin hace que
el adicionar o remover elementos de cualquier parte de la lista sea muy fcil, sin embargo,
dificulta el acceso a un elemento dada su posicin, pues requiere recorrer la cadena de
enlaces entre sus elementos.
Adems de los mtodos definidos en la interfaz List, una LinkedList define:
addFirst(Object): Adiciona un objeto al comienzo de la lista.
addLast(Object): Adiciona un objeto al final de la lista.
Object removeFirst(): Retira el primer elemento de la lista, y retorna una referencia a
este.
Object removeLast(): Retira el ltimo elemento de la lista, y retorna su referencia.
Ejemplo:
En un banco se requiere que cada vez que llegue un nuevo cliente a la caja, ste sea
agregado al final de la fila de clientes, y cuando alguien deba pasar a la caja para ser
atendido, se retire del principio de la fila.
Cdigo (apartes):
.
}
import java.util.*;
public class Banco{
private LinkedList fila;
public Cliente pasarACaja(){
Cliente atendido= (Cliente) fila.removeFirst();
return atendido;
}
.
}
5.3.2
Adicional al mtodo equals, la clase Object define el mtodo hashCode, el cual retorna un
valor entero diferente para cada objeto existente en memoria. Se recomienda que al
sobrescribir el mtodo equals, tambin se sobrescriba el mtodo hashCode, de manera
que para dos objetos que se definen como iguales, el valor entero retornado por dicho
mtodo sea el mismo para ambos objetos, independiente de que los dos ocupen espacios
diferentes en la memoria.
La clase String contiene el mtodo equals sobrescrito indicando que dos objetos de este
tipo son iguales si la cadena que contienen es la misma. Adicionalmente, en la clase se
ha sobrescrito el mtodo hashCode para que el valor retornado sea el mismo para dos
cadenas iguales.
Ejemplo: Se desea tener un conjunto de estudiantes, cmo se determina que un
estudiante ya existe, y por lo tanto no se adiciona de nuevo a la coleccin? Puede
definirse que la forma de identificar de manera nica a un estudiante es a travs de un
cdigo, por lo que la definicin de la clase Estudiante quedara as:
class Estudiante {
private String cdigo;
private String nombre;
Existen dos formas para determinar cundo un objeto es mayor que otro, y de esta forma
poder ordenarlos en el conjunto. La primera forma es hacer que las clases cuyos objetos
se insertarn en el conjunto implementen la interfaz java.lang.Comparable, y la segunda
forma es usar un objeto que implemente la interfaz java.util.Comparator. Estas interfaces
se explicarn en detalle a continuacin.
Interfaz Comparable
Esta interfaz permite definir lo que se denomina el orden natural (natural order) de los
objetos. La interfaz define un nico mtodo:
Por ejemplo, se desea tener un conjunto ordenado de revistas, donde la mayor es la que
tiene mayor nmero de pginas. Defina la clase Revista de manera que se permita el
ordenamiento de los objetos de este tipo al momento de ingresarlos a un conjunto
ordenado.
Solucin: De acuerdo al enunciado se requiere:
- Definir la clase Revista, que debe implementar la interfaz Comparable.
- Sobreescribir el mtodo compareTo para establecer el orden de las revistas.
- Sobreescribir los mtodos equals y hashCode, de manera que sean compatibles con
la definicin dada en compareTo.
class Revista implements Comparable {
private String nombre;
private int pginas;
Con la definicin de Revista dada, se podran agregar objetos de este tipo a una coleccin
de tipo SortedSet, quedando ordenadas de menor a mayor cantidad de pginas.
Interfaz Comparator
Adems del orden natural de los objetos, es posible definir tambin otro tipo de
ordenamiento llamado orden parcial (partial orden). Esta forma de definir el orden de los
objetos se utiliza cuando hay clases que no implementan la interfaz Comparable, o ya
tienen un orden natural definido, pero se desea crear otra coleccin que los ordene de
manera diferente.
Para definir el orden parcial es necesario tener una clase que implemente la interfaz
Comparator, y luego usar alguno de sus objetos, que se denomina objeto comparador,
como un auxiliar para comparar dos objetos (de otra clase), que se desean ordenar. La
interfaz Comparator define el siguiente mtodo:
Ejemplo: Modifique el ejemplo anterior, de manera que las revistas no se ordenen por el
nmero de pginas, sino por su nombre.
Solucin:
Teniendo en cuenta que no se quiere modificar el orden natural por el cual se determina si
una revista es mayor que otra (cantidad de pginas), se crear un objeto de tipo
Comparator que defina el orden parcial solicitado, con base en el orden alfabtico del
nombre de las revistas:
import java.util.*;
class ComparaRevista implements Comparator {
public int compare(Object objeto1, Object objeto2) {
// La clase Revista debe tener un mtodo getNombre
String nombreRevista1 = ((Revista)objeto1).getNombre();
String nombreRevista2 = ((Revista)objeto2).getNombre();
//Se usa el mtodo compareTo de String para determinar cul de las dos
//cadenas del nombre es mayor
return nombreRevista1.compareTo(nombreRevista2);
}
}
Adems del constructor por defecto, esta clase tiene los siguientes constructores:
HashSet(Collection): Crea un HashSet que contiene los elementos que hay en la
coleccin dada.
HashSet(int): Crea un HashSet con la capacidad inicial indicada. Esta capacidad inicial
no corresponde al nmero de elementos sino al nmero de entradas en la tabla hash,
Esta clase tiene varios constructores adems del constructor por defecto, entre los que se
encuentran:
TreeSet(Comparator): Crea un TreeSet que ordena los elementos con ayuda del
objeto comparador que recibe como parmetro. Esto permite modificar la forma de
ordenamiento establecida por defecto (dada por el orden natural de los
elementos).
TreeSet(Collection): Recibe por parmetro una coleccin de cualquier tipo (de la
jerarqua de Collection) y retorna un TreeSet con los elementos ordenados de
acuerdo a su orden natural.
Ejemplo:
Elabore una aplicacin que permita almacenar las revistas, de acuerdo a la definicin de
la clase Revista dada en el apartado 5.3.2.2, de manera que no se almacenen revistas
repetidas (con igual cantidad de pginas), y que queden ordenadas de acuerdo a su
cantidad de pginas, de menor a mayor.
import java.util.*;
public class Revistero {
public static void main(String args[]) {
TreeSet revistasOrdenadas = new TreeSet();
revistasOrdenadas.add(new Revista("Web",50));
revistasOrdenadas.add(new Revista("Caricaturas",40));
revistasOrdenadas.add(new Revista("Inventos",80));
revistasOrdenadas.add(new Revista("Java",50));
revistasOrdenadas.add(new Revista("Literatura",35));
System.out.println(revistasOrdenadas);
}
}
La salida es:
[Literatura-35, Caricaturas-40, Web-50, Inventos-80]
Esta salida nos muestra cmo las revistas quedaron ordenadas por el nmero de pginas,
y adems no se tienen dos revistas con el mismo nmero de pginas.
5.4
Iteradores
Los iteradores son clases a partir de las cuales se crean objetos que permiten recorrer
una coleccin. El recorrido involucra que se vaya pasando uno a uno por los elementos
que contiene la coleccin, sin importar de qu tipo es la estructura interna utilizada para
definirla (arreglo, lista encadena, rbol, tabla hash, etc). En algunos colecciones, el
iterador tambin puede eliminar un elemento de la coleccin.
A continuacin se revisar la interfaz que define a los iteradores.
5.4.1
Interfaz Iterator
uno
dos
tres
dos
tres
iterador
uno
iterador
ref
uno
dos
tres
iterador
ref
Se retira el segundo el
elemento de la coleccin:
iterador.remove();
uno
tres
iterador
ref
dos
uno
tres
ref
iterador
Todas aquellas colecciones que desean ofrecer el recorrido de los elementos que
contienen usando un iterador, implementan a la interfaz Iterable. En esta interfaz est
definido el encabezado del mtodo iterator(), el cual retorna el objeto iterador. Dado que
la interfaz Collection implementa a Iterable, todas las interfaces que hereden de ella o las
clases que la implementen, debern contar con el mtodo iterator().
Pregunta:
Qu diferencias observa en la forma como se define el mtodo para remover objetos en
la interfaz Collections frente a como lo define la interfaz Iterator?
Ejemplo:
Una constructora tiene varias casas para la venta, que son objetos que se encuentran en
una coleccin. Cuando un cliente desea ver las casas se recorre la coleccin para
mostrarle la informacin de las mismas, y si desea comprarla se retira de la coleccin.
Diagrama de clases simplificado:
Casa
rea
precio
descripcin
Casa()
Constructora
*
mostrarCasas()
adicionarCasa()
retirarCasa()
Cdigo (apartes):
public class Casa {
private double rea;
private double precio;
private String descripcin;
public Casa(double rea, double precio, String descripcin) {
this.rea = rea;
this.precio = precio;
this.descripcin = descripcin;
}
public String toString() {
return (descripcin + " Area: "+rea);
}
}
import java.util.*;
public class Constructora {
private Collection coleccinCasas = new ArrayList( );
public void adicionarCasa(double rea, double precio, String descripcin) {
coleccinCasas.add(new Casa(rea,precio, descripcin));
}
Debe tenerse cuidado con las operaciones que retiran o adicionan elementos a la lista
despus de creado el iterador, puesto que los iteradores pueden presentar problemas si
se modifica la coleccin que estn recorriendo. En estos casos se lanza una
ConcurrentModificationException.
Pregunta
Qu sucede si en lugar de la instruccin iterador.remove(), en el cdigo anterior, se
utiliza coleccinCasas.remove(casa)?
5.4.2
Interfaz ListIterator
Esta interfaz define el comportamiento de un iterador especial para las colecciones de tipo
Lista. El tipo de recorrido ofrecido por un objeto de tipo ListIterator permite recorrer la lista
en dos direcciones, hacia adelante o hacia atrs.
boolean hasPrevious(): Retorna true si hay un elemento antes de la posicin actual del
iterador.
Object previous(): Retorna el elemento anterior, si lo hay.
add(Object): Adiciona un objeto en la posicin actual del iterador. Si el iterador se
acab de crear se adicionar el elemento al comienzo de la lista. Despus de insertar
el elemento una llamada a previous retornar una referencia al mismo.
set(Object): Reemplaza el ltimo elemento que retorn el iterador (con next o
previous), con el objeto que llega como parmetro.
Los ltimos dos mtodos, que permiten adicionar o modificar un elemento en la coleccin,
resultan ms eficientes que usar los mtodos de List para los mismos propsitos.
Ejemplo:
Se tiene una lista de camiones que son cargados con mercanca para llevar a diferentes
lugares del pas. Cuando llega un nuevo camin, ste se ubica despus del primer
camin en la lista que ya tenga su carga completa.
Diagrama de clases:
Camin
capacidad
cargado
Camiones
*
ingresarCamin()
Cdigo (apartes):
class Camion {
private int capacidad;
private boolean cargado;
import java.util.*;
public class Camiones {
private List listaCamiones = new LinkedList();
public void ingresarCamin(Camion caminNuevo) {
ListIterator iterador = listaCamiones.listIterator();
5.5
while (iterador.hasNext()) {
Camion camin = (Camion)iterador.next();
if (camin.estCargado()) {
iterador.add(caminNuevo);
break;
}
}
Jerarqua Map
La interfaz Map define otro estilo de colecciones en Java, donde se tienen parejas
clave/valor, llamadas normalmente entradas (entry). La idea es que las claves sean
nicas, y a travs de una clave se puede obtener el valor asociado a ella. Tanto la clave
como el valor deben ser objetos, no tipos bsicos.
Es comn identificar a las colecciones de esta jerarqua como de tipo diccionario. En un
diccionario se tienen palabras nicas, y a cada palabra est asociado su significado.
Haciendo el smil con el diccionario, en una coleccin tipo map tendramos una clave la
palabra en el diccionario --, con su valor asociado el significado de esa palabra --.
Aunque las colecciones de esta jerarqua tambin son grupos de objetos, la forma de
trabajar con ellos es un poco diferente, y por lo tanto la interfaz Map no hereda de
Collection.
Interfaz SortedMap
Interfaz Map.Entry
Esta interfaz define mtodos que permiten acceder a la informacin de las parejas
clave/valor almacenadas en un Map.
5.5.3
Clase AbstractMap
Esta clase, de tipo abstracto, implementa a la interfaz Map, y define cierta funcionalidad
bsica para las clases que hereden de ella. Es especialmente til cuando se requiere
elaborar una coleccin propia con el comportamiento de un diccionario, en cuyo el
Pregunta:
Cules son los mtodos cuyo cdigo ya fue elaborado en la clase AbstracMap?
5.5.4
Clase TreeMap
Esta clase, hija de AbstractMap, y que implementa la interfaz SortedMap, permite tener
parejas clave/valor ordenadas.
Al igual que la clase TreeSet, permite ordenamientos dados por el orden natural de los
objetos, o dados por un objeto comparador. Este ltimo ordenamiento se obtiene cuando
se utiliza el constructor TreeMap(Comparator).
Los constructores de esta clase son:
Ejemplo
En este ejemplo se definen dos clases: Cancin y Compositor. De ambas clases se crean
varios objetos y se adicionan en un TreeMap. La clave para encontrar cada compositor
es la cancin, de manera que se almacenarn por orden alfabtico de acuerdo al ttulo de
la cancin. Se define adicionalmente un mtodo que permite mostrar las canciones
registradas en orden alfabtico.
public class Cancin implements Comparable{
private String ttulo;
private double duracin;
contina
continuacin
import java.util.*;
public class Disquera{
private TreeMap canciones=new TreeMap();
5.5.5
Clase HashMap
Esta clase, hija de AbstractMap, permite tener parejas clave/valor organizadas usando el
cdigo hash del objeto clave, por lo que es importante que los objetos que sean claves
redefinan el mtodo hashCode. Cada vez que una pareja se va a adicionar o buscar en el
HashMap, el cdigo hash de la clave es convertido a una posicin dentro de la tabla, lo
cual hace muy eficientes ambas operaciones.
Algunos constructores de esta clase son:
HashMap(): Crea un HashMap con una capacidad inicial por defecto de 16.
HashMap(int): Crea un HashMap con la capacidad inicial especificada en el parmetro
HashMap(Map):Crea un HashMap a partir del Map recibido por parmetro.
El comportamiento de esta clase es similar al que se indic para HashSet. Debe tenerse
en cuenta que las entradas almacenadas en el HashMap no quedan ordenadas.
Ejemplo:
Se han definido las clases Placa y Vehculo para el sistema de trnsito de la ciudad.
Cada placa guarda la informacin de su identificacin, fecha y ciudad de expedicin, y de
cada vehculo se almacena la informacin de su modelo, color, marca y propietario. En el
..
}
import java.util.*;
public class Trnsito {
private HashMap autos = new HashMap();
public Vehiculo buscar(Placa placa){
Vehiculo auto = (Vehiculo)autos.get(placa);
return auto;
}
.
5.6
Otros elementos
En el marco de trabajo de colecciones existe una clase especial llamada Collections. Esta
clase contiene nicamente mtodos estticos, que permiten realizar diversas operaciones
con las colecciones. Algunos de estos mtodos son:
int binarySearch(List, Object): Busca el objeto dado en la lista, la cual debe estar
ordenada de manera ascendente. Retorna la posicin donde se encuentra el objeto o
1 si no se encuentra.
void reverse(List): Invierte el orden de los elementos de la lista.
sort(List): Ordena los elementos de la lista, de acuerdo con su orden natural.
sort(List, Comparator): Ordena los elementos de la lista, de acuerdo con el orden dado
por el comparador.
Object min(Collection): Retorna el menor elemento de la coleccin, segn el orden
natural de los objetos.
Object max(Collection): Retorna el mayor elemento en la coleccin, de acuerdo con su
orden natural.
Ejercicios
Complemente los ejemplos presentados en este captulo, definiendo para cada uno el
tipo de coleccin que se puede utilizar.
En una gran biblioteca de la ciudad han decidido facilitar las bsquedas de los
diferentes recursos con los que cuenta, y le han pedido que modele esta situacin
(utilizando colecciones) y realice el programa en Java, teniendo en cuenta:
- Todos los recursos (libros y revistas) tienen un nombre y un nmero que los
identifica. Los libros tienen, adems, el nombre de su autor o autores (pueden ser
varios) y la editorial. Las revistas tienen la fecha de publicacin y el nombre de
todos los artculos que contienen, indicando para cada uno su autor.
- Todos los recursos estn organizados en estantes, y es importante saber el
nmero del estante y la posicin dentro del mismo que ocupa cada recurso.
- En general la forma de buscar todos los recursos es a travs de su nombre, por lo
que le han pedido que se pueda realizar esta bsqueda rpidamente.
- Cada vez que se consulta una revista deben desplegarse todos los artculos que
tiene.
Para el ejercicio anterior incluya una nueva opcin que permita realizar bsquedas por
autor.
En una empresa con muchos empleados se deben generar reportes peridicos donde
se muestre la informacin de todos ellos. Estos reportes deben estar ordenados
alfabticamente. Determine el tipo de coleccin que se puede utilizar en este caso y
elabore el programa correspondiente.