Está en la página 1de 34

Java Avanzado

Autor
Oscar Alejandro Gonzlez Bustamante.
Java Avanzado.
Colecciones
(Utileras del paquete java.util )
Colecciones ( paquete java.util ).

.!. U"#$%&'A( ()A*U%"% JA+A.U"#$)
Una coleccin a veces llamada un contenedor - es simplemente un objeto que agrupa mltiples
elementos en una simple unidad. Las colecciones son usadas para almacenar, recuperar, manipular y
comunicar datos agregados. Tpicamente, ellas representan elementos de un grupo natural, tal como una
mano de pocker ( una coleccion de cartas ), un buzn ( una coleccin de correos ), o un directorio
telefnico ( una lista que mapea nombres y nmeros telefnicos ).
Las colecciones son un Framework
1
diseado para soportar mltiples colecciones de una manera
jerrquica mediante la herencia y no debe confundirse con un patrn
2
. Esta conformada esencialmente
de interfaces, implementaciones y algoritmos. Estas colecciones se agrupan en el paquete o AP java.util
y se puede consultar en lnea la documentacin de estas por internet en el sitio web
http://www.javasoft.com.
Todas las colecciones del framework contienen lo siguiente:
#nter,aces- Las interfaces o interfaces collection son tipos de datos abstractos que representan
colecciones. Las interfaces collection permiten a las colecciones ser manipuladas independientemente
de los detalles de su representacin. En lenguajes orientados a objetos, las interfaces forman una
jerarqua.
#mplementaciones- Estas son implementaciones concretas de las interfaces collection. En esencia, son
estructuras de datos reusables.
Al.oritmos- Estos son los mtodos que ejecutan calculos de gran utilidad, tales como la bsqueda y el
ordenamiento sobre los objetos que implementan las interfaces collection. De los algoritmos se dicen que
son polimorficos, debido a que pueden ser usados los mismos mtodos en muchas y diferentes
implementaciones. En escencia, los algoritmos tienen una funcionalidad reusable.
.! Colecciones de inter,aces.
Las colecciones nacen de la necesidad de algunos programas que requieren guardar gran cantidad de
datos de distintos tipos de objetos. Estas agrupan mltiples elementos y almacenan, recuperan, y
manipulan esos mismos elementos.
1 Framework: Trmino usado en programacin orientada a objetos para definir un conjunto de clases que definen un diseo
abstracto para solucionar un conjunto de problemas relacionados. Como ejemplos de frameworks tenemos:
wing: framework de interfaces gr!ficas de usuario
" #akarta truts: framework de aplicaciones web en #a$a basado en el patrn %&C
" #%F '#a$a %edia Framework(: framework para el tratamiento de contenidos multimedia 'audio" $)deo" etc.(
" #*+ '#a$a *d$anced +maging(: framework para el procesamiento de im!genes en #a$a
.
, -atrn: .n patron de diseo es una plantilla de clases e interfaces para resol$er un problema prototipo o recurrente en el
desarrollo de sistemas orientados a objets" / el ni$el de abstraccin de un patrn es ma/or que el del framework
. Como 0jemplos de patrones
tenemos el %&C: modelo1$ista1controlador
" el ingleton: objeto 2nico
" el 3*4: 3ata *ccess 4bject
/ 5a/ muc5os otros mas.
Unidad 3.- Colecciones Elaborado por Oscar Alejandro Gonzlez Bustamante pgina 2 de 34
Colecciones ( paquete java.util ).

El ncleo del interfaz collection encapsula diferentes tipos de colecciones, y que son mostradas en la
figura abajo:
El nucleo del collection interfaces.
Estas interfaces permiten ser manipuladas independientemente de los detalles de sus detalles de su
representacin. Como se aprecia en la figura, estan organizadas jerarquicamente.
Observe que todo el nucle del collection interfaces son genericas. Por ejemplo, esta es la declaracin de
la interface Collection.
public interface Collection<E>
La sintxis <E> le indica a usted que la interface es genrica. Cuando se declara una instancia de
Collection, se puede y se debe especificar el tipo de objeto contenido en la coleccin. Especificando el
tipo el compilador verifica ( en tiempo de compilacin ) que el tipo de objeto que se pone dentro de la
coleccin sea correcto, entonces se reducen errores en tiempo de ejecucin. Vea la parte de tipos
genericos mas adelante en esta leccin.
Si el programador entiende como usar estas interfaces, entonces sabr mucho mas acerca del Java
Collections Framework.
La lista siguiente describe el nucleo de las collection interfaces.
Collection - Es la raz de la jerarqua de las colecciones. Una coleccin representa un grupo de
objetos conocidos como elementos. La interface Collection es el comn denominador de todas las
colecciones implementadas y es usada para manipularlas cuando la mxima generalidad es deseable.
Algunos tipos de colecciones permiten elementos duplicados, y otras no. Algunas son ordered y otras
son unordered. Java no provee ninguna implementacin directa de esta interface pero provee
implementaciones para subinterfaces mas especificas, tales como Set y List.
Set - Una coleccin que no contiene elementos duplicados. Esta interface modela la abstraccin matemtica
conjunto y es usada para representar conjuntos, tales como cartas de una mano de pocker, los cursos hechos por
un estudiante en su historial acadmico, o los procesos que se ejecuten en una mquina.
List - es una coleccin ordered ( a veces denominada secuencia ). Las listas contienen elementos
duplicados. El usuario de una lista generalmente tiene un control preciso sobre el orden en que cada
elemento de la lista fue insertado y puede acceder a los elementos mediante sus indices enteros
( posicin ). Si alguna vez ha usado Vector, entonces ya esta familiarizado con las listas.
Queue --- una coleecion usada para almacenar mltiples elementos en base a prioridades para ser
procesados. Adems las operaciones bsicas de Collection, una Queue provee operaciones
adicionales de insercin, extraccin e inspeccin.
Las Queues tpicamente, pero no necesariamente, ordenan los elementos de manera FFO (first-in, first-
out). Entre sus excepciones tenemos queues prioritarias, donde el orden de los elementos es de acuerdo
a un comparador provisto o en base al orden natural de los elementos. Cualquiera que sea el orden
usado, la cabeza de la queue es el elemento que debera ser removido al invocar a remove o a poll.
Unidad 3.- Colecciones Elaborado por Oscar Alejandro Gonzlez Bustamante pgina 3 de 34
Colecciones ( paquete java.util ).

En una FFO queue, todos los elementos nuevos que son insertados en la cola de la queue. Otros tipos
de queues son usadas con diferentes reglas de colocacin. Cada implementacin de Queue debe
especificar sus propiedades de ordenamiento.
Map un objeto que mapea llaves con valores. Un Map no contiene llaves duplicadas; cada llave puede
mapear a lo mas un valor. Si usara un Hashtable ya estara familiarizado con las bases de Map.
Las dos ltimas interfaces del nucleo de las collection interfaces son meramente variaciones de Set y
Map:
SortedSet --- un Set que mantiene sus elementos en orden ascendente. Varias operaciones
adicionales son provistas para tomar ventaja de el orden. Conjuntos sorteados son usados por su
naturaleza de conjuntos ordenados, tales como una lista de palabras y los roles de una membreca.
SortedMap --- un Map que mantiene sus mapeos en orden de una llave ascendente. Este es el Map
analogo a SortedSet. Sorted maps son usados de manera narual en colecciones ordenadas por pares
de llave/valor, tales como diccionarios y directorios telefnicos.
6.1.1 +nterfa7 Collection.
$a inter,ace Collection
Una Collection ( Coleccin ) representa a un grupo de objetos conocidos como sus elementos. La interface
Collection es usada para pasar a travez de colecciones de objetos donde la generalidad al mximo es deseada.
Por ejemplo, por convencin todas las implementaciones de las colecciones de propsito general, tienen un
constructor que toma un Collection como argumento. Este constructor es conocido como constructor de
conversin, este inicializa la nueva coleccin para cotener todos los elementos en una coleccin especfica,
cualquiera que sea la coleccin o subinterface o tipo de implementacin. En otras palabras, le permite convertir el
tipo de coleccin.
Suponga, por ejemplo, que tiene un Collection <Strin> c, el cual puede ser un List, un Set, o cualquier
tipo de Collection. Este idioma crea un nuevo !rra"List ( una implementacin de la interface List ),
incialmente conteniendo todos los elementos en c.
List<Strin> list # ne$ !rra"List<Strin>%c&'
A continuacin se muestra la interface Collection.
public interface Collection<E> e(tends )terable<E> *
++ ,asic operations
int si-e%&'
boolean isEmpt"%&'
boolean contains%.b/ect element&'
boolean add%E element&' ++optional
boolean remove%.b/ect element&' ++optional
)terator<E> iterator%&'
++ ,ul0 operations
boolean contains!ll%Collection<1> c&'
boolean add!ll%Collection<1 e(tends E> c&' ++optional
boolean remove!ll%Collection<1> c&' ++optional
boolean retain!ll%Collection<1> c&' ++optional
void clear%&' ++optional
++ !rra" operations
.b/ect23 to!rra"%&'
<4> 423 to!rra"%423 a&'
5
Unidad 3.- Colecciones Elaborado por Oscar Alejandro Gonzlez Bustamante pgina 4 de 34
Colecciones ( paquete java.util ).

La interface hace lo que se esperaria dada una Collection que representa a un grupo de objetos. La interface
tiene mtodos que le dicen cuantos elementos hay en la coleccin ' si-e" isEmpt" ( , para checar cuando un
objeto dado esta presente en la coleecin ' contains (" y para agregar o remover un elemento de la coleccin ' add"
remove (" y para proveer un iterator sobre la coleccin ' iterator (.
El mtodo add esta definido suficientemente general como para colecciones que permiten duplicados asi como
para aquellas que no. Garantiza que la Collection contendra el elemento especificado despues de que su
invocacin se complet, y retorna true si la Collection cambia como resultade de la invocacin. Similarmente, el
mtodo remove es diseado para remover una sola instancia de el elemento especificado de la Collection, asumindo
que esta contenga el elemento, y retornar true si la Collection fue modificada como resultado.
&ecorriendo colecciones
Hay dos maneras de recorrer colecciones ( 1 ) con la construccin for each y ( 2 ) usando iteradores (
)terators &.
$a construcci/n ,or 0 eac1
La construccin for each permite recorrer de manera concisa una coleccin o un array usando el ciclo for . El
cdigo siguiente usa la construccin for each para imprimir cada elemento de la coleccin en una lnea
separada:
for % .b/ect ob/ 6 collection &
S"stem7out7println% ob/ &'
#teradores
Un )terator es un objeto que permite recorrer una coleccin y remover elementos de una coleccin
selectivamente, si as se desea. Se obtiene un )terator de una coleccin mediante la invocacin de su mtodo
iterator. El siguiente cdigo muestra la interface terator.
public interface terator <E> {
boolean hasNext();
E next ( );
void remove( ); // opcional
}
El mtodo hash8e(t retorna true si la iteracin tiene mas elementos, y el mtodo next retorna el siguiente
elemento en la iteracin. El mtodo remove quita o remueve el ltimo elemento que fue retornado por ne(t de la
coleccin. El mtodo remove puede ser invocado una vez por invocacin del ne(t y lanza una excepcin si la
regla es violada.
Note que )terator7remove es la unica manera segura de modificar una coleccion durante la iteracin; el
comportamiento no especificado si la coleccin tratada es modificada en cualquier otra manera mientras la iteracin
esta en progreso.
Use )terator en lugar de la construccin for each cuando se necesite:
Remover el elemento actual. La construccin for each oculta el iterador, asi que no puede invocar remove.
Por lo tanto, la construccin for each no es usable para el filtrado.
terar sobre multiples colecciones en paralelo.
El siguiente mtodo muestra como suar un )terator para filtrar una Collection arbitraria --- esto es, recorrer la
coleccin removiendo elementos especficos.
static void filter % Collection <1> c & *
for % )terator<1> it # c7iterator%& ' it7has8e(t%&' &
Unidad 3.- Colecciones Elaborado por Oscar Alejandro Gonzlez Bustamante pgina 5 de 34
Colecciones ( paquete java.util ).

if % 9cond% it7ne(t%& & &
it7remove%&'
5
Este simple fragmento de cdigo es polimrfico, lo cual significa que trabaja para cualquier Collection
independentemente de su implementacin. Este ejemplo demuestra como es facil escribir algoritmos polimrficos
usando el Java Collections Framework.
23todos que tra4ajan so4re todos los elementos de una Collection.
Los llamados bul0 operations son mtodos que ejecutan una operacin en toda una Collection. Se podran
implementar estas operaciones taquigrficas usando operaciones bsicas, aunque en la mayora de los casos tales
implementaciones podran ser menos eficientes. Los mtodos siguientes son bulk operations:
contains!ll retorna true si la Collection objetivo contiene todos los elementos en la Collection
especificada.
add!ll Agrega todos los elementos de la Collection especificada a la Collection objetivo.
remove!ll -- remueve de la Collection objetivo todos sus elementos que estan contenidos en la Collection
especificada.
retain!ll remueve de la Collection objetivo todos sus elementos que no estan contenidos tambin en la
Collection especificada. Esto es, solo retiene aquellos elementos en la Collection objetivo que tambin estan
contenidas en la Collection especificada.
clear -- remueve todos los elementos de la Collection.
Los mtodos add!ll: remove!ll, y retain!ll todos ellos retornan true si la Collection objetivo fue
modificada en el proceso de ejecutar la operacin.
Un simple ejemplo de el poder de las bulk operations , solo considere remover todos las instancias de un lemento
especifico, e, de una Collection: c.
c7remove!ll% Collections7sinleton%e& &'
Mas especificamente, suponga que se quiere remover todos los elementos null de una Collection.
c7remove!ll% Collections7sinleton% null & &'
Este idioma usa Collections7sinleton, el cual es un mtodo static factory que retorna un conjunto inmutable
Set conteniendo solo el elemento especificado.
Operaciones Arra5 de la Collection #nter,ace.
El mtodo to!rra" esta provisto como un puente entre colecciones y otros viejos APs que esperan arrays de
salida. Las operaciones array permiten los contenidos de una Collection ser transladados en un array. La forma
simple sin argumentos crea un nuevo array de .b/ect. Hay formas mas complejas que permiten al invocador
proveer un array o escoger el tipo en tiempo de ejecucin para el array de salida.
Por ejemplo, suponga que c es una Collection. El siguiente fragmento de cdigo vierte el contenido de c dentro
de en nuevo array de .b/ect el cual aloja con una longitud identica el numero de elementos en c.
.b/ect2 3 a # c7to!rra"%&'
Suponga que se sabe que c contiene solo cadenas ( tal vez porque c es de tipo Collection<Strin> ). Lo
siguiente vierte el contenido de c a el nuevo array alojando objetos Strin donde la longitud es idntica a el
nmero de elementos en c.
Strin2 3 a # c7to!rra"% ne$ Strin2 ; 3 &'
Unidad 3.- Colecciones Elaborado por Oscar Alejandro Gonzlez Bustamante pgina 6 de 34
Colecciones ( paquete java.util ).

.!.6 #nter,az (et.
Un Set es una Collection. Set es la palabra inglesa para "conjunto y por lo tanto en un Set no puede
haber duplicados. Por lo general en un set el orden no es dato. Si bien es posible que existan sets que
nos aseguren un orden determinado cuando se recorren ( p. ej. Obtener strings en orden alfabtico), ese
orden no es arbitrario y decidido por el programador, ya que la interfaz Set no tiene ninguna funcionalidad
para manipularlo, ( como si lo hace la interfaz List ).
La ventaja de usar Sets es que el mtodo contains%& suele ser muy eficiente. Es por lo tanto
conveniente utilizarlos cuando necesitemos una coleccin en la que no importe el orden, pero que se
necesite preguntar si un elemento est o no en la coleccin.
A continuacin la nterface Set:
public interface Set<E> e(tends Collection<E> *
++ .peraciones b<sicas
int si-e%&'
boolean isEmpt"%&'
boolean contains%.b/ect element&'
boolean add%E element&' ++.pcional
boolean remove%.b/ect element&' ++.pcional
)terator<E> iterator%&'
++ operaciones ,ul0
boolean contains!ll%Collection<1> c&'
boolean add!ll%Collection<1 e(tends E> c&' ++opcional
boolean remove!ll%Collection<1> c&' ++opcional
boolean retain!ll%Collection<1> c&' ++opcional
void clear%&' ++opcional
++ .peraciones !rra"
.b/ect23 to!rra"%&'
<4> 423 to!rra"%423 a&'
5
La plataforma Java contiene tres implementacines de propsito general de Set: HashSet, 4reeSet y
Lin0edHashSet. HashSet , almacena sus elementos en una tabla hash, y es la implementacin con el
mejor desempeo; sin embargo no hay garanta e lo concertiente al orden de iteracin. 4reeSet la cual
almacenasus elementos en un arbol con el algoritmo rojo-negro, ordena sus elementos basado en sus
valores; es substancialmente mas lento que HashSet. Lin0edHashSet la cual implementa la tabla
hash con una lista ligada, ordena sus elementos basados en el orden en el cual fueron insertados a el
conjunto ( orden de insercin ).
Aqu tenemos un simple pero util idioma Set. Suponga que tiene una Collection: c: y queire crear
otra Collection conteniendo los mismos elementos pero con todos los duplicados eliminados. El
siguiente fragmento de cdigo hace el truco:
Collection<4"pe> no=ups # ne$ HashSet<4"pe>%c&'
Esto trabaja creando un Set ( el cual por defincin no tiene duplicados ), inicialmente conteniendo todos
los elementos en c. Usa el constructor de conversin estndar descrito en la nterface Collection descrito
anteriormente.
Aqu tenemos una variante menor de este idioma que conserva el orden de la coleccin original mientras
remueve los elementos duplicados:
Unidad 3.- Colecciones Elaborado por Oscar Alejandro Gonzlez Bustamante pgina 7 de 34
Colecciones ( paquete java.util ).

Collection<4"pe> no=ups # ne$ Lin0edHashSet<4"pe>%c&'
El siguiente fragmento de cdigo usa un mtodo generico que encapsula el idioma precedente,
retornando un Set de el mismo tipo generico como el que le fue pasado.
public static <E> Set<E> remove=ups%Collection<E> c& *
return ne$ Lin0edHashSet<E>%c&'
5
Ahora al ejecutar el programa:
import /ava7util7>'
public class ?ind=ups *
public static void main%Strin23 ars& *
Set<Strin> s # ne$ HashSet<Strin>%&'
for %Strin a 6 ars&
if %9s7add%a&&
S"stem7out7println%@=uplicado detectado6 @ A a&'
S"stem7out7println%s7si-e%& A @ palabras distintas6 @ A s&'
5 ++ fin del main
5 ++ fin de la clase ?ind=ups
/ava ?ind=ups "o vine "o vi "o me fui
La siguiente salida es producida;The following output is produced.
=uplicado detectado6 "o
=uplicado detectado6 "o
B palabras distintas6 2vi: vine: "o: me: fui3
Fijese que el cdigo siempre se refiere a la Collection como su interface tipo ( Set ) en lugar de su tipo de
implementacin ( HashSet). Esto es una prctica fuertemente recomendable en la programacin porque
le da flexibilidad de cambiar las implementaciones solamente mediante el cambio del constructor. Si
cualquiera de las variables utilizadas para almacenar una coleccin o los parmetros utilizados para
pasar alrededor de l se declaran de la Collection del tipo de implementacin en lugar de su tipo de
interfaz, todas esas variables y los parmetros se debe cambiar a fin de cambiar su tipo de
implementacin.
Adems, no hay garanta de que el programa resultante haga el trabajo. Si el programa utiliza
operaciones no estndar no presentes en el original tipo de implementacin, pero no en la nueva, el
programa fallar. Refirindose a las colecciones slo por su interfaz le previene utilizar cualquier
operacin no estndar.
La implementacin de tipo del Set en el ejemplo anterior es HashSet, el cual no garantiza el orden de
los elementos en el Set. Si quiere que el programa imprima las palabras en una lista en orden alfabtico,
solamente cambie el tipo de la implementacin del Set de HashSet a 4reeSet. Realizando ese
cambio trivial de una linea de cdigo el cambio causa que la ejecucin de la lnea de comandos del
ejemplo anterior nos genere la siguiente salida:
=uplicado detectado6 "o
=uplicado detectado6 "o
B palabras distintas6 2fui: me: vi: vine: "o3
Unidad 3.- Colecciones Elaborado por Oscar Alejandro Gonzlez Bustamante pgina 8 de 34
Colecciones ( paquete java.util ).

23todos que tra4ajan so4re todos los elementos de un (et.
Estos mtodos ( bulk operations ) estn particularmente bien adaptadas a los Set, cuando son apliicadas,
ejecutan operaciones del algebra estndar para conjuntos. Suponga que sC y sD son conjuntos. Aqui
tiene las ( bulk operations ) para los conjuntos:
s1.containsAll (s2) - devuelve true si sD es un subconjunto de sC. (sD es un subconjunto de sC si el
conjunto sC contiene todos los elementos en sD.)
sC7add!ll %sD& - transforma sC en la unin de sC y sD. (La unin de dos conjuntos es el conjunto
que contiene todos los elementos que figuran en ambos conjuntos.)
sC7retain!ll %sD& - transforma sC en la interseccin de sC y sD. (La interseccin de dos conjuntos
es el conjunto que contenga slo los elementos comunes a ambos conjuntos.)
sC7remove!ll %sD& - se transforma en el sC (asimtrica) o conjunto diferencia de sC y sD. (Por
ejemplo, el conjunto diferencia de sC menos sD es el conjunto que contiene todos los elementos
encontrados en sC, pero no en sD).
Para calcular la unin, interseccin, o el conjunto diferencia de dos conjuntos no-destructivamente ( esto
es sin modificar ningn conjunto ) , el invocador debe copiar un conjunto antes de invocar a la operacin
apropiada. Lo siguiente da el siguiente idioma:
Set<4"pe> union # ne$ HashSet<4"pe>%sC&'
union7add!ll%sD&'
Set<4"pe> intersection # ne$ HashSet<4"pe>%sC&'
intersection7retain!ll%sD&'
Set<4"pe> difference # ne$ HashSet<4"pe>%sC&'
difference7remove!ll%sD&'
El tipo de implementacin del conjunto resultante en los idiomas precedentes es HashSet, el cual, como
ya se mencion, es el mejor de todas las implementaciones relacionadas de Set en la plataforma Java.
Sin embargo, cualquier implementacin general de Set podra substituirlo.
Revisemos de nuevo el programa FindDups.java. Suponga que se quiere conocer cuantas palabras en
la lista ocurren solamente una vez y que palabras ocurren mas de una vez, entonces no quiere que los
duplicados se impriman repetidamente. Para esto debe manejar dos conjuntos uno que contenga cada
palabra en la lista de argumentos y otra que contenga solo los duplicados. Las palabras que ocurren solo
una vez son el conjunto diferencia de esos dos conjuntos, el cual ya sabemos como calcularlo. Aqu esta
el programa resultante:
import /ava7util7>'
public class ?ind=upsD *
public static void main%Strin23 ars& *
Set<Strin> uniEues # ne$ HashSet<Strin>%&'
Set<Strin> dups # ne$ HashSet<Strin>%&'
for %Strin a 6 ars&
if %9uniEues7add%a&&
dups7add%a&'
Unidad 3.- Colecciones Elaborado por Oscar Alejandro Gonzlez Bustamante pgina 9 de 34
Colecciones ( paquete java.util ).

++ =iferencia de con/untos =estructiva
uniEues7remove!ll%dups&'
S"stem7out7println%@Falabras unicas6 @ A uniEues&'
S"stem7out7println%@Falabras duplicadas6 @ A dups&'
5 ++ fin del mGtodo main
5 ++ fin de la clase ?ind=upsD
Lnea de ejecucin del programa:
/ava ?ind=upsD "o vine "o vi "o me fui
Salida del programa:
Falabras unicas6 2vi: vine: me: fui3
Falabras duplicadas6 2"o3
Una operacin de conjuntos algebraica menos comn es la de establecer la diferencia simtrica el
conjunto de elementos contenidos en ambos conjuntos especificados pero no en ambos. El siguiente
cdigo calcula la diferencia simtrica de los dos conjuntos no destructivamente.
Set<4"pe> s"mmetric=iff # ne$ HashSet<4"pe>%sC&'
s"mmetric=iff7add!ll%sD&'
Set<4"pe> tmp # ne$ HashSet<4"pe>%sC&'
tmp7retain!ll%sD&&'
s"mmetric=iff7remove!ll%tmp&'
Operaciones Arra5 en la inter,ace (et.
Las operaciones array no hacen nada especial para los conjuntos SetS mas de lo que hacen para
cualquier Collection. Estas operaciones ya fueron descritas en la seccin de la interface
Collection.
#mplementaciones de (et-
7as1(et
HashSet es la implementacin de Set que podramos llamar "general. Es decir, cuando no necesitamos
nada especfico y solamente queremos una coleccin que no permita elementos duplicados, nos
conviene usar HashSet, ya que es una coleccin muy eficiente en cuanto al uso de memoria.
HashSet es una coleccin unsorted y unordered, eso quiere decir que no tiene orden alguno (bueno, al
menos ningn orden lgico desde la perspectiva "humana). As que si necesitamos almacenar datos
ordenados, esta coleccin no nos sirve.
.
El siguiente ejemplo nos muestra el uso de la clase implementadora HashSet.
import /ava7util7>'
public class VerCon/unto*
public static void main%Strin ars23&*
Unidad 3.- Colecciones Elaborado por Oscar Alejandro Gonzlez Bustamante pgina 10 de 34
Colecciones ( paquete java.util ).

HashSet<Strin> lista # ne$ HashSet<Strin>%&'
lista7add%@Sopes@&'
lista7add%@Famba-os@&'
lista7add%@Horditas@&'
lista7add%@Sopes@&'
lista7add%@4laco"os@&'
lista7add%@4aEuitos@&'
lista7add%@4aEuitos@&'
lista7add%@?lautas@&'
S"stem7out7print%@Los anto/itos I@desordenados @&'
S"stem7out7println%@" sin repeticionesI@@&'
)terator i # lista7iterator%&'
$hile%i7has8e(t%&&
S"stem7out7print%i7ne(t%&7toStrin%&A@ @&'
5 ++ fin del metodo main
5 ++ fin de la clase VerCon/unto
Salida6
Los anto/itos @ordenados " sin repeticiones@
Sopes 4laco"os 4aEuitos Horditas Famba-os ?lautas
Se observa en la salida que aunque hemos agregado dos "Taquitos solo aparece uno porque los
conjuntos no permiten repeticiones.
$in8ed7as1(et
LinkedHashSet es muy parecida a HashSet, con la diferencia de que se encuentra doblemente enlazada,
lo cual implica que va a ser ms rpida para iterar sobre ella, pero ms lenta para insertar y eliminar
elementos. Adems, al estar enlazada, los elementos van a estar ordenados de acuerdo al orden de
insercin.
import /ava7util7>'
public class VerLin0edHashSet*
public static void main%Strin ars23&*
Lin0edHashSet<Strin> lista # ne$ Lin0edHashSet<Strin>%&'
lista7add%@Sopes@&'
lista7add%@Famba-os@&'
lista7add%@Horditas@&'
lista7add%@Sopes@&'
lista7add%@4laco"os@&'
lista7add%@4aEuitos@&'
lista7add%@4aEuitos@&'
lista7add%@?lautas@&'
S"stem7out7print%@Los anto/itos I@ordenados de acuerdo al orden @&'
S"stem7out7println%@de inserciJn " sin repeticionesI@@&'
)terator i # lista7iterator%&'
$hile%i7has8e(t%&&
S"stem7out7print%i7ne(t%&7toStrin%&A@ @&'
5 ++ fin del metodo main
Unidad 3.- Colecciones Elaborado por Oscar Alejandro Gonzlez Bustamante pgina 11 de 34
Colecciones ( paquete java.util ).

5 ++ fin de la clase VerLin0edHashSet
Salida6
Los anto/itos @ordenados de acuerdo al orden de inserciJn " sin repeticiones@
Sopes Famba-os Horditas 4laco"os 4aEuitos ?lautas
(orted(et
Es clase abstracta superclase de TreSet y es un conjunto que mantiene sus elementos en orden
ascendente. Varias operaciones adicionales se prestan a tomar ventaja de la ordenacin. Clasificacin se
utilizan conjuntos de conjuntos, naturalmente, ordenado, tales como listas de palabras y la composicin.
"ree(et
TreeSet es una coleccin ordered y sorted. Esto quiere decir que, por defecto, la coleccin tiene un orden
natural. Y adems, ofrece la posiblidad de definirle un orden personalizado (con Comparable o
Comparator).. En cuanto al consumo de memoria, hay que tener en cuenta que TreeSet es una
coleccin muy lenta.
import java.util.*;
public class VerTreeSet{
public static void main(String args[]){
TreeSet<String> lista = new TreeSet<String>();
// SortedSet<String> lista = new TreeSet<String>(); // da el mismo resultado
lista.add("Sopes");
lista.add("Pambazos");
lista.add("Gorditas");
lista.add("Sopes");
lista.add("Tlacoyos");
lista.add("Taquitos");
lista.add("Taquitos");
lista.add("Flautas");
System.out.print("Los antojitos \"ordenados de acuerdo al orden ");
System.out.println("de natural y sin repeticiones\"");
terator i = lista.iterator();
while(i.hasNext())
System.out.print(i.next().toString()+" ");
} // fin del metodo main
} // fin de la clase TreeSet
Salida6
Los anto/itos @ordenados de acuerdo al orden de natural " sin repeticiones@
?lautas Horditas Famba-os Sopes 4aEuitos 4laco"os
Unidad 3.- Colecciones Elaborado por Oscar Alejandro Gonzlez Bustamante pgina 12 de 34
Colecciones ( paquete java.util ).

.!. #nter,az $ist.
Lo que hay que entender de List, es que tiene ndices, es decir, cada elemento tiene un ndice (o index en
ingls). La interfaz List agrega varios mtodos a Collection para trabajar con los ndices. Como get(),
indexOf(), etc., Todas las implementaciones de List son ordered pero no sorted. Estn ordenadas por el
ndice de sus elementos. Las listas pueden contener elementos duplicados. Adems las operaciones
heredadas de Collection, la interface List incluye operaciones para lo siguiente:
!cceso posicional maneja elementos basados en su posicin numrica en la lista.
,KsEueda busca un objeto especfico en la lista y regresa su posicin numrica.
)teraciJn extiende la semntica )terator y toma ventaja de la naturaleza secuencial de la lista.
Rangos ejecuta operaciones de rango arbitrarias sobre la lista.
La interface List a continuacin:
public interface List<E> e(tends Collection<E> *
++ !cceso posicional
E et%int inde(&'
E set%int inde(: E element&' ++opcional
boolean add%E element&' ++opcional
void add%int inde(: E element&' ++opcional
E remove%int inde(&' ++opcional
boolean add!ll%int inde(:
Collection<1 e(tends E> c&' ++opcional
++ ,KsEueda
int inde(.f%.b/ect o&'
int last)nde(.f%.b/ect o&'
++ )teraciJn
List)terator<E> list)terator%&'
List)terator<E> list)terator%int inde(&'
++ Lanos
List<E> subList%int from: int to&'
5
La plataforma Java contiene dos implementaciones de propsito general de List que son, !rra"List
la cual es usualmente la implementacin de mejor desempeo, y Lin0edList la cual ofrece mejor
desempeo solo baja ciertas circunstancias. Tambin, Vector que se ha readaptado para implementar
List.
Comparaci/n con el +ector
Si ha usado Vector, ya esta familiarizado con las bases generales de List ( por supuesto, List es una
interface, mientras que Vector es una implementacin concreta. ) List corrige algunas deficiencias
menores del AP en Vector. Conumunmente usamos las operaciones Vector, tales como elementAt y
setElementAt, que les han dado nombres mucho mas cortos. Cuando considere que estas dos
operaciones de List son anlogas a los parntesis cuadrados de los arrays, y que parecen ser nombres
mas cortos son altamante deseables, Considere la sentencia siguiente:
a2i3 # a2/37times%a203&'
Su equivalencia usando Vector es:
Unidad 3.- Colecciones Elaborado por Oscar Alejandro Gonzlez Bustamante pgina 13 de 34
Colecciones ( paquete java.util ).

v7setElement!t%v7element!t%/&7times%v7element!t%0&&: i&'
Su equivalencia usando List es:
v7set%i: v7et%/&7times%v7et%0&&&'
Tal vez ya se dio cuenta que el mtodo set, el cual remplaza el mtodo setElement!t de Vector, invierte el orden
de los argumentos de tal manera que concuerdan con la correspondiente operacin del array. Considere la
siguiente sentencia:
ift2B3 # @olden rins@'
La sentencia equivalente con Vector es:
ift7setElement!t%@olden rins@: B&'
La sentencia equivalente con List es:
ift7set%B: @olden rins@&'
Para mantener la coherencia, el mtodo add% int: E &, el cual remplaza al mtodo
insertElement% .b/ect: int &, tambin invierte el orden de los argumentos.
Hay tres operaciones de rango en Vector ( inde(.f, last)nde(.f, y setSi-e ) que han sido remplazadas por
la unica operaciones de rango ( subList ), la cual es mucho mas poderosa y consistente.
Operaciones de Collection
Las operaciones heredadas de Collection todas hacen lo que usted esperaria de ellas, asumiendo que esta
familiarizado con ellas. Si no esta familiarizado con ellas, repselas de la seccin Collection )nterface. La
operacin remove siempre se refiere a remover la primera ocurrencia del elemento especificado de la lista. Las
operaciones add y add!ll siempre agreagan un nuevo elemento(s) a el final de la lista, as pues, la siguiente
expresin concatena una lista a otra:
listC7add!ll%listD&'
He aqu una expresin no destructiva, la cual produce una tercera List constituda de una segunda lista
concatenada de la primera.
List<4"pe> listM # ne$ !rra"List<4"pe>%listC&'
listM7add!ll%listD&'
Fijese que la expresin, esta en una forma no destructiva, toma ventaja de la conversin estndar del constructor de
!rra"List.
As como en la interface Set, la fortaleza de List depende de los requerimientos en los mtodos eEuals y
hashCode asi que dos listas de objetos puedan ser comparados para una igualdad lgica sin tener en cuenta las
implementaciones de las clases. Dos listas de objetos son iguales si contienen los mismos elementos y en el
mismo orden.
Acceso posicional 5 operaciones de 49squeda.
Las operaciones de acceso posicional ( et: set: add y remove ) se comportan de la misma forma que sus
contrapartes en Vector ( element!t: setElement!t: insertElement!t, y removeElement!t ) con una
notable excepcin: Las operaciones set y remove retornan el viejo valor que esta siendo sobreescrito o
removido: La contraparte Vector ( setElement!t y removeElement!t) retornan nada ( void ). Las
operaciones de bsqueda inde(.f y last)nde(.f se comportan exactamente como sus idnticas operaciones
nombradas en Vector.
Unidad 3.- Colecciones Elaborado por Oscar Alejandro Gonzlez Bustamante pgina 14 de 34
Colecciones ( paquete java.util ).

La operacin add!ll inserta todos los elementos de una Collection especfica comenzando desde una posicin
tambin especifica. Los elementos son insertados en el orden en que son retornados por el iterador especificado
de Collection. Esta invocacin es de acceso posicional anlogo a la operacin add!ll de Collection.
Aqu tenemos un pequeo mtodo que intercambia dos valores indexados en una List.
public static <E> void s$ap%List<E> a: int i: int /& *
E tmp # a7et%i&'
a7set%i: a7et%/&&'
a7set%/: tmp&'
5
Este es un algortmo polimrfico. Este intercambia dos elementos de cualquier List, a pesar de su tipo de
implementacin. Aqu tenemos otro algoritmo polimrfico que usa el previo mtodo swap.
public static void shuffle%List<1> list: Landom rnd& *
for %int i # list7si-e%&' i > C' i--&
s$ap%list: i - C: rnd7ne(t)nt%i&&'
5
Este algoritmo, el cual esta incluido en la clase Collections de la plataforma Java, permuta aleatoriamente la lista
especificada utilizando la fuente especificada de aleatoriedad. Es un poco sutil. Se ejecuta la lista de la parte inferior,
en repetidas ocasiones el intercambio de un elemento seleccionado al azar en la posicin actual. A diferencia de la
mayora de los ingenuos intentos de mezclar o revolver, este es justo ( todas las permutaciones ocurren con la
misma probabilidad, asumiendo una fuente de aleatoriedad imparcial ) y es rpido ( se requieren exactamente
list7si-e%& - C intercambios ). Los siguientes programas usan este algoritmo para imprimir palabras en el
argumento de la lista en orden aleatorio:
import /ava7util7>'
public class Shuffle *
private static void revuelvo%Strin23 palabras & *
List<Strin> list # ne$ !rra"List<Strin>%&'
for %Strin a 6 palabras&
list7add%a&'
Collections7shuffle%list: ne$ Landom%&&' ++ operaciJn para revolver
S"stem7out7println%list&'
5 ++ fin del mGtodo revuelvo
public static void main%Strin23 ars& *
Strin23 comida #
*@Queso@: @Halletas@ : @Huitlacoche@: @!citrJn@:
@4asa/o@:@8opales@:@4ortillas@: @!maranto@: @Machaca@: @!nchoas@ 5'
++ se invoca al mGtodo Eue va a revolver las palabras
revuelvo% comida &'
5 ++ fin del mGtodo main
5 ++ fin de la clase Shuffle
De hecho, este programa se puede hacer incluso ms corto y ms rpido. La clase !rra"s tiene un mtodo static
factory llamado asList, el cual permite que un arreglo sea visto como una List. Este mtodo no copia el array.
Los cambios en la List se escriben a traves del array y vice versa. La List resultante no es una implementacin
List de propsito general, porque no implementa las operaciones ( opcionales ) add y remove. Los Arrays no
son redimencionales ( o de tamao cambiante ). Tomando ventaja del mtodo !rra"s7asList e invocando a
Unidad 3.- Colecciones Elaborado por Oscar Alejandro Gonzlez Bustamante pgina 15 de 34
Colecciones ( paquete java.util ).

shuffle, el cual usa el cdigo por omisin de aleatoriedad, se obtiene el siguiente pequeo programa que se
comporta de manera identica al previo programa:
import /ava7util7>'
public class ShuffleD *
public static void main%Strin23 ars& *
Strin23 comida #
*@Queso@: @Halletas@ : @Huitlacoche@: @!citrJn@:
@4asa/o@:@8opales@:@4ortillas@: @!maranto@: @Machaca@: @!nchoas@ 5'
List<Strin> list # !rra"s7asList%comida&' ++ de !rra" a List
Collections7shuffle%list&' ++ Hace la revoltura
S"stem7out7println%list&'
5 ++ fin del mGtodo main
5 ++ fin de la clase ShuffleD
#teradores
Como es de esperarse el iterador devuelto por una operacin ListNs iterator retornar los elementos de la
lista en una secuencia adecuada. Tambin List nos provee de un buen iterador, llamado List)terator, el cual
permite recorrer la lista en cualquier direccin, modificando la lista durante la iteracin, y obtener la posicin actual
del iterador. La interface List)terator se muestra a continuacin:
public interface List)terator<E> e(tends )terator<E> *
boolean has8e(t%&'
E ne(t%&'
boolean hasFrevious%&'
E previous%&'
int ne(t)nde(%&'
int previous)nde(%&'
void remove%&' ++opcional
void set%E e&' ++opcional
void add%E e&' ++opcional
5
Los tres mtodos que List)terator hereda de )terator ( has8e(t, ne(t, y remove ) hacen exactamente la
misma cosa en ambas interfaces. El mtodo hasFrevious y previous son exactamente analogos a has8e(t y
ne(t. Las ex - operaciones se refieren al elemento antes ( implcito ) cursor, mientras que las posteriores se
refieren al elemento despus del cursor. La operacin previa mueve el cursor hacia atras, mientras ne(t lo mueve
hacia adelante.
Aqu tenemos las expresiones estndar para iteracin hacia atras a traves de la lista.
for %List)terator<4"pe> it # list7list)terator%list7si-e%&&'
it7hasFrevious%&' & *
4"pe t # it7previous%&'
777
5
Cheque que el argumento de list)terator en la expresin previa. La interface List tiene dos formas de
mtodo list)terator. La forma que no tiene argumentos y retorna un List)terator posicionado al inicio de la
lista; y la otra forma que tiene un argumento int y retorna un List)terator posicionado en el ndice
especificado. El ndice se refiere al elemento que debera ser retornado por una invocacin inicial a ne(t. Una
inicial invocacin a previous retornara el elemento el cual el indice fuera inde(-C. En una lista de longitud n, hay
nAC valores validos para el indice, de ; a n, inclusive.
Unidad 3.- Colecciones Elaborado por Oscar Alejandro Gonzlez Bustamante pgina 16 de 34
Colecciones ( paquete java.util ).

ntuitivamente hablando, el cursor siempre esta entre dos elementos el primero que debera ser retornado por la
invocacin de previous y el que sera retornado por invocacin de ne(t. Los valores vlidos del ndice n AC
corresponden a las n A C espacios entre los elementos, desde el espacio antes del primer elemento a el espacio
despues del ltimo. La figura muestra las cinco posibles posiciones el cursor en una lista que contiene cuatro
elementos.
Las cinco posicines posibles del cursor.
La invocacin a los mtodos ne(t y previous pueden entremezclarse, as que tiene que ser un poco cuidadoso.
La primera invocacin a previous retorna el mismo elemento de la ltima invocacin a ne(t. Similarmente, la
primera invocacin a ne(t despus de una secuencia de invocaciones a previous retorna el mismo elemento de
la ltima invocacin de previous.
No debera sorprenderle que el mtodo ne(t)nde( devuelva el indice del elemento que podra devolverse despus
de subsecuentes invocaciones a ne(t, que previous)nde( devuelva el indice de el elemento que podra ser
devuelto por subsecuentes invocaciones a previous. Estas invocaciones son tpicamente utilizadas para reportar
la posicin donde algo se encontr o la posicin de algo que se guardo de la List)terator, asi que otra
List)terator con posicin idntica podra ser creada.
Tambin no le debera sorprender que el nmero devuelto por ne(t)nde( es siempre una vez mayor que el nmero
devuelto por previous)nde(. Esto implica el comportamiento de los dos casos lmite: ( 1 ) una invocacin a
previous)nde( cuando el cursor esta antes que el elemento inicial devolver -C y ( 2 ) una invocacin a
ne(t)nde( cuando el cursor esta despus de elemento final devolver list7si-e%&. Para concretar todo
esto, lo siguiente es una posible implementacin de List7inde(.f.
public int inde(.f%E e& *
for %List)terator<E> it # list)terator%&' it7has8e(t%&' &
if %e ## null 1 it7ne(t%& ## null 6 e7eEuals%it7ne(t%&&&
return it7previous)nde(%&'
return -C' ++ Elemento no encontrado
5
Observe que el mtodo inde(.f devuelve it7previous)nde(%& aunque esta recorriendo la lista en direccin
hacia adelante. La razn es que it7ne(t)nde(%& devolvera el ndice del elemento que va examinar, y queremos
devolver el ndice del elemento que hemos examinado.
La interface )terator provee la operacin remove para remover el ltimo elemento devuelto por ne(t de una
Collection. Para List)terator, esta operacin remueve el ltimo elemento devuelto por ne(t o previous.
La interface List)terator provee dos operaciones adicionales para modificar la lista set y add. El mtodo
set sobreescribe el ltimo elemento devuelto por ne(t o previous por el elemento especificado. El siguiente
algoritmos polimrfico usa set para reemplazar todas las ocurrencias de un valor especificado por otro.
public static <E> void replace%List<E> list: E val: E ne$Val& *
for %List)terator<E> it # list7list)terator%&' it7has8e(t%&' &
if %val ## null 1 it7ne(t%& ## null 6 val7eEuals%it7ne(t%&&&
it7set%ne$Val&'
5
Unidad 3.- Colecciones Elaborado por Oscar Alejandro Gonzlez Bustamante pgina 17 de 34
Colecciones ( paquete java.util ).

El nico pequeo truco en este ejemplo es la prueba de igualdad entre val y it7ne(t. Usted necesita un caso
especial para el valor de val a null para prevenir una excepcin 8ullFointerE(ception.
El mtodo add inserta el nuevo elemento en la lista inmediatamente antes de la posicin actual del cursor. Este
mtodo es ilustrado en el siguiente algoritmo polimrfico que reemplaza todas las ocurrencias de un valor especfico
con la secuencia de valores contenidos en una lista especificada.
public static <E> void replace%List<E> list: E val:
List<1 e(tends E> ne$Vals& *
for %List)terator<E> it # list7list)terator%&' it7has8e(t%&' &*
if %val ## null 1 it7ne(t%& ## null 6 val7eEuals%it7ne(t%&&& *
it7remove%&'
for %E e 6 ne$Vals&
it7add%e&'
5
5
5
Operaci/n de ran.o para listas.
La operacion de rango, subList ( int from)nde(: int to)nde( ), devuelve una List que es la porcin de
la lista que indica el rango de from)nde(, inclusive, a to)nde(, exclusivo. Esta operacin de rango abierto es
tpica del ciclo for:
for %int i # from)nde(' i < to)nde(' iAA& *
777
5
*s) que esta operacion de rango en la List implica" que la List de$uelta es respaldada en la List de la cual subList fue
in$ocada" asi que los cambios en la original se reflejan en la 2ltima.
Este mtodo elimina la necesidad de operaciones explcitas de rango ( del tipo que comunmente existen en los
arrays ). Cualquier operacin que espere una List puede ser usada como una operaciJn de rano
pasando un subList en lugar de toda la List. Por ejemplo, la siguiente expresin remueve un rango de
elementos de una List.
list7subList%from)nde(: to)nde(&7clear%&'
Expresiones similares pueden ser construdas para buscar un elemento en un rango.
int i # list7subList%from)nde(: to)nde(&7inde(.f%o&'
int / # list7subList%from)nde(: to)nde(&7last)nde(.f%o&'
Observe que las expresiones anteriores encuentran el elemento en la subList, no en el ndice den la List de
respaldo.
Cualquier algoritmo polimrfico que opera sobre una List, tal como replace y shuffle por ejemplo, trabaja con
la List devuelta por subList.
He aqu un algoritmo polimrfico el cual utiliza en su implementacin una subList para tratar una parte de una
baraja. Esto es, retornar una nueva List ( la "mano ) conteniendo el nmero especificado de elementos tomados
desde el final de la List especificada ( la "baraja ). Los elementos devueltos en la mano son removidos de la
baraja.
public static <E> List<E> dealHand%List<E> dec0: int n& *
int dec0Si-e # dec07si-e%&'
List<E> handVie$ # dec07subList%dec0Si-e - n: dec0Si-e&'
Unidad 3.- Colecciones Elaborado por Oscar Alejandro Gonzlez Bustamante pgina 18 de 34
Colecciones ( paquete java.util ).

List<E> hand # ne$ !rra"List<E>%handVie$&'
handVie$7clear%&'
return hand'
5
Note que el algoritmo remueve la mano desde el final de la baraja. Para muchas implementaciones de List, tales
como !rra"List, el desempeo de remover elementos desde el final de la lista es substancialmente mejor que
remover elementos desde el inicio.
El siguiente programa usa el mtodo dealHand en combinacin con Collections7shuffle para generar manos
de una baraja normal de 52 cartas. El programa toma dos comandos de linea como argumentos ( 1 ) el nmero de
manos a manejar y ( 2 ) el nmero de cartas en cada mano.
import /ava7util7>'
class =eal *
public static <E> List<E> dealHand%List<E> dec0: int n& *
int dec0Si-e # dec07si-e%&'
List<E> handVie$ # dec07subList%dec0Si-e - n: dec0Si-e&'
List<E> hand # ne$ !rra"List<E>%handVie$&'
handVie$7clear%&'
return hand'
5 ++ fin del mGtodo dealHand
public static void main%Strin23 ars& *
int numHands # )nteer7parse)nt%@B@&' ++%ars2;3&'
int cardsFerHand # )nteer7parse)nt%@O@&' ++%ars2C3&'
++ Ma0e a normal BD-card dec07
Strin23 suit # ne$ Strin23
*@espadas@: @cora-ones@: @diamantes@: @trebol@5'
Strin23 ran0 # ne$ Strin23
*@as@:@D@:@M@:@P@:@B@:@O@:@Q@:@R@:
@S@:@C;@:@/oto@:@reina@:@re"@5'
List<Strin> dec0 # ne$ !rra"List<Strin>%&'
for %int i # ;' i < suit7lenth' iAA&
for %int / # ;' / < ran07lenth' /AA&
dec07add%ran02/3 A @ de @ A suit2i3&'
Collections7shuffle%dec0&'
for %int i#;' i < numHands' iAA&
S"stem7out7println%dealHand%dec0: cardsFerHand&&'
5 ++ fin del mGtodo main
5 ++ fin de la clase =eal
Una posible salida al ejecutar el programa =eal7/ava es:
2B de diamantes: Q de espadas: O de diamantes: D de cora-ones: M de cora-ones: S de cora-ones3
2R de cora-ones: reina de trebol: C; de diamantes: reina de cora-ones: P de trebol: re" de espadas3
2M de espadas: as de trebol: R de trebol: /oto de espadas: re" de trebol: D de trebol3
2B de espadas: R de diamantes: /oto de diamantes: re" de diamantes: Q de trebol: M de trebol3
2as de diamantes: B de cora-ones: C; de trebol: C; de cora-ones: P de diamantes: /oto de trebol3
Aunque la operacin subList es extremadamente poderosa, hay que tener algunos cuidados cuando se use. La
semntica de la List devuelta por un subList se vuelve indefinida si los elementos agregados o removidos de la
List de respado se efectuan de otra forma que via la que devuelve List. Esto es altamente recomendado ya que
la List devuelta por subList es tratada solo como un objeto transitorio. -- para ejecutar una secuencia de
operaciones de rango en la List de respaldo.
Unidad 3.- Colecciones Elaborado por Oscar Alejandro Gonzlez Bustamante pgina 19 de 34
Colecciones ( paquete java.util ).

Al.oritmos de $ist.
La mayora de algoritmos polimrficos en la clase Collections se aplican a List. Teniendo estos algoritmos a su
disposicin se hace muy sencillo manipular listas. Aqu esta un resumen de estos algoritmos, los cuales son
descritos con mayor detalle en la seccin de Algoritmos.
sort - ordena una List usando el algoritmo merge sort, el cual provee una ordenacin rapida y estable ( una
ordenacin estable el aquella que no reordena los elementos iguales ).
shuffle permuta aleatoriamente los elementos en la List.
reverse invierte el orden de todos los elementos de la List.
rotate rota todos los elementos en la List por una determinada distancia.
s$ap intercambia los elementos de unas especifcadas posiciones en una List.
replace!ll remplaza todas las ocurrencias de un valor especfico por otro.
fill sobreescribe cada elemento en la List con el valor especificado.
cop" copia la List origen a la List destino.
binar"Search busca un elemento en la List ordenada usando un algoritmo de bsqueda binaria.
inde(.fSubList devuelve el ndice de la primera sublista de una List que es igual a otra.
last)nde(.fSubList devuelve el ndice de la ltima sublista de una List que es igual a otra.
#mplementaciones de $ist-
Arra5$ist
ArrayList es una coleccin sumamente eficiente en lo que respecta a la iteracin. Por lo que es muy
recomendable utilizarla si necesitamos una coleccin con rpido acceso a sus elementos.
import /ava7util7!rra"List'
+>>
> !rra"List es mu" usada porEue6
> Se utili-a de forma similar a un arrelo7
> !unEue funciona como un arrelo: la diferencia es Eue no ha" Eue
> preocuparse por el tamaTo7
> El tamaTo del almacenamiento crece solo cuando se van aTadiendo elementos7
>+
public class Frueba!rra"List *

public static void main% Strin ars23 & *
!rra"List<Strin> listaStrin # ne$ !rra"List<Strin>%C;&'
for% int i # ;' i < D;' iAA & *
listaStrin7add%@Cadena nKmero @ A i &'
5 ++ fin del for
S"stem7out7println%@La colecciJn tiene @ A
listaStrin7si-e%& A @ elementos@&' ++ tamaTo de !rra"List

for%.b/ect elem 6 listaStrin &
S"stem7out7println% elem &'
Unidad 3.- Colecciones Elaborado por Oscar Alejandro Gonzlez Bustamante pgina 20 de 34
Colecciones ( paquete java.util ).

5 ++ fin del main
5 ++ fin de la clase Frueba!rra"List
Salida6
La colecciJn tiene D; elementos
Cadena nKmero ;
Cadena nKmero C
Cadena nKmero D
Cadena nKmero M
Cadena nKmero P
Cadena nKmero B
Cadena nKmero O
Cadena nKmero Q
Cadena nKmero R
Cadena nKmero S
Cadena nKmero C;
Cadena nKmero CC
Cadena nKmero CD
Cadena nKmero CM
Cadena nKmero CP
Cadena nKmero CB
Cadena nKmero CO
Cadena nKmero CQ
Cadena nKmero CR
Cadena nKmero CS
+ector
Vector es prcticamente lo mismo que ArrayList, con la diferencia de que tiene todos sus mtodos
sincronizados. Por lo que si no van a trabajar con hilos, olvdense de Vector, ya que es ms lenta. Y si
por otro lado, si van a trabajar con hilos, tampoco es obligatorio que usen esta coleccin. ya que pueden
usar ArrayList y algunos mtodos que trae Collection para este tipo thread safety.
$in8ed$ist
LinkedList tiene sus elementos doblemente enlazados. Lo que le da ms rapidez en la insercin y
eliminacin de elementos. Pero es un poco ms lenta que ArrayList para iterar. Es decir: si se desea
rpido acceso a los elementos de la lista, use ArrayList, y si en cambio, si se desea una rpida insercin
y eliminacin de los elementos, use LinkedList.
El siguiente ejemplo VerLinkedList.java maneja una lista ligada de objetos de la clase Galleta.java y los
inserta en la lista con el mtodo add(), asi como checa el tamao de la lista con el mtodo size().
Tambin observe como se imprime los elementos de la lista ligada mediante un for y un Listterator.
A continuacin se lista el cdigo de la clase Galleta.java.
public class Halleta *

+>> variables >+
Strin nombre'
public Strin sabor # @?resa@'
public double precio # ;7;d'

+>> constantes >+
public static final int F)C.S # B'
Unidad 3.- Colecciones Elaborado por Oscar Alejandro Gonzlez Bustamante pgina 21 de 34
Colecciones ( paquete java.util ).

public static final Strin ?.LM! # @Estrella@'

+>> Creates una nueva instancia de Halleta >+
public Halleta%& *
nombre # @Estrellita@'
5 ++ fin del constructor
+>> Crea una nueva instancia de Halleta% Strin nombre & >+
public Halleta%Strin nombre& *
this7nombre # nombre'
5 ++ fin del constructor
+>> Crea una nueva instancia de Halleta% Strin nombre: Strin sabor & >+
public Halleta%Strin nombre: Strin sabor& *
this% nombre &'
this7sabor # sabor'
5 ++ fin del constructor

+>> Crea una nueva instancia de Halleta% Strin nombre: Strin sabor & >+
public Halleta%Strin nombre: Strin sabor: double precio& *
this% nombre: sabor &'
this7precio # precio'
5 ++ fin del constructor
+>>
> metodo toStrin%& sirve para convertir los valores de
> las variables miembro de la clase Halleta a cadenas "
> esto es convertir el ob/eto a un Strin para ver su estado
> Ureturn Strin
>+
public Strin toStrin%& *
return @2 @ A this7nombre A
@:It@ A this7sabor A
@:It@ A this7precio A
@:It@ A this7?.LM! A
@:It6 @ A this7F)C.S A
@ 3 @ '
5 ++ fin del metodo toStrin%&
5 ++ fin de la clase Halleta
A continuacin se lista el cdigo de la clase VerLinkedList.java
import /ava7util7Lin0edList'
import /ava7util7List)terator'
public class VerLin0edList *

public static void main% Strin23 ars & *
++ creamos B instancias de la clase Halleta
Halleta C # ne$ Halleta%@Estrella de chocolate @: @Chocolate@: B;&'
Halleta D # ne$ Halleta%@Estrella de coco @: @Coco @: BO&'
Halleta M # ne$ Halleta%@Estrellita del rio @: @Vainilla @: QO&'
Halleta P # ne$ Halleta%@Estrellita del norte @: @Miel @: QO&'
Halleta B # ne$ Halleta%@Estrellita del mar @: @Moca @: QO&'

++ constru"o una lista liada con la listaHalletas para arear
++ elementos de tipo Halleta
Unidad 3.- Colecciones Elaborado por Oscar Alejandro Gonzlez Bustamante pgina 22 de 34
Colecciones ( paquete java.util ).

Lin0edList<Halleta> listaLiadaHalleta # ne$ Lin0edList<Halleta>% &'
++ areo las alletas a la lista liada de alletas7
listaLiadaHalleta7add% C &'
listaLiadaHalleta7add% D &'
listaLiadaHalleta7add% M &'
listaLiadaHalleta7add% P &'
listaLiadaHalleta7add% B &'
++ checo numero de elementos en la lista liada
S"stem7out7println%@8Kmero de elementos en la lista liada6 @ A
listaLiadaHalleta7si-e%& &'

++ imprimo las alletas con un for
S"stem7out7println%@)mpresiJn de las alletas con ciclo for@&'
for%.b/ect elem 6 listaLiadaHalleta &
S"stem7out7println% elem &'

++ creo otra alleta
Halleta talia # ne$ Halleta%@Estrellita de la televisiJn @: @Ca/eta @:
SB&'
S"stem7out7println%@!reamos la siuiente alleta al final @ A
@de la lista liada6In@ A talia &'
++ areo una alleta a la lista liada
listaLiadaHalleta7add% talia &' ++ areo al final de la lista liada
++ vuelvo a checar el numero de lementos
S"stem7out7println%@8Kmero de elementos en la lista6 @ A
listaLiadaHalleta7si-e%& &'
S"stem7out7println%@!reamos la misma alleta a la mitad de @ A
@la lista liada@&'
++ areo otra alleta a la mitad de la lista liada
listaLiadaHalleta7add% %int&%listaLiadaHalleta7si-e%& + D &: talia &'
++ checo de nuevo el nKmero de alletas en la lista liada
S"stem7out7println%@8Kmero de elementos en la lista liada6 @ A
listaLiadaHalleta7si-e%& &'
S"stem7out7println%@imprimimos la lista liada de alletas conV A
@ un List)terator@&'
++ imprimo las alletas de la lista liada con un List)terator
List)terator i # listaLiadaHalleta7list)terator%&'
$hile%i7has8e(t%&&
S"stem7out7println%i7ne(t%&7toStrin%& &'

S"stem7out7println%@In?in del prorama7@&'

5 ++ fin del main
5 ++ fin de la clase VerLin0edList
Salida6
8Kmero de elementos en la lista liada6 B
)mpresiJn de las alletas con ciclo for
2 Estrella de chocolate : Chocolate: B;7;: Estrella: 6 B 3
2 Estrella de coco : Coco : BO7;: Estrella: 6 B 3
2 Estrellita del rio : Vainilla : QO7;: Estrella: 6 B 3
Unidad 3.- Colecciones Elaborado por Oscar Alejandro Gonzlez Bustamante pgina 23 de 34
Colecciones ( paquete java.util ).

2 Estrellita del norte : Miel : QO7;: Estrella: 6 B 3
2 Estrellita del mar : Moca : QO7;: Estrella: 6 B 3
!reamos la siuiente alleta al final de la lista liada6
2 Estrellita de la televisiJn : Ca/eta : SB7;: Estrella: 6 B 3
8Kmero de elementos en la lista6 O
!reamos la misma alleta a la mitad de la lista liada
8Kmero de elementos en la lista liada6 Q
imprimimos la lista liada de alletas con un List)terator
2 Estrella de chocolate : Chocolate: B;7;: Estrella: 6 B 3
2 Estrella de coco : Coco : BO7;: Estrella: 6 B 3
2 Estrellita del rio : Vainilla : QO7;: Estrella: 6 B 3
2 Estrellita de la televisiJn : Ca/eta : SB7;: Estrella: 6 B 3
2 Estrellita del norte : Miel : QO7;: Estrella: 6 B 3
2 Estrellita del mar : Moca : QO7;: Estrella: 6 B 3
2 Estrellita de la televisiJn : Ca/eta : SB7;: Estrella: 6 B 3
?in del prorama7
.!.: #nter,az *ueue.
Lo que ms importa de Queue es el orden prioritario de insercin y eliminacin de elementos. Cuando
necesitemos utilizar algn principio como FFO (First n First Out) o LFO (Last n First Out), seguramente
vamos a usar algunas de las implementaciones de Queue. Aqu tenemos la interface Queue :
public interface Queue<E> e(tends Collection<E> *
E element%&'
boolean offer%E e&'
E pee0%&'
E poll%&'
E remove%&'
5
Cada mtodo Queue existe in dos formas: ( 1 ) un que lanza una excepcin si la operacin falla, y ( 2 ) la
otra que devuelve un valor especial si la operacin falla ( ya sea null o false, dependiendo de la
operacin ). La estructura regular de la interface es ilustrada en la siguiente tabla:
%structura de la inter,ace *ueue
$anza una e;ception <evuelve valor especial
#nsertar add(e) offer(e)
&emover remove() poll()
%;aminar element() peek()
Las Queue tpicamente pero no necesariamente ordenan los elementos en una FFO ( fist-in, first-out ).
Entre las excepciones estn las queues prioritarias, las cuales ordenan los elementos en base a sus
valores. Cualquiera que sea el algoritmo de ordenamiento usado, la cabeza de la queue es el elemento
que podra ser removido por la invocacin de remove o poll. En una FFO queue, todos los
elementos nuevos son insertados en la cola de la queue. Otros tipos de queues pueden usar diferentes
Unidad 3.- Colecciones Elaborado por Oscar Alejandro Gonzlez Bustamante pgina 24 de 34
Colecciones ( paquete java.util ).

reglas de colocacin. Cada implementacin de Queue debe especificar sus propiedades de
ordenamiento.
Es posible que una implementacin de Queue restrinja el nmero de elementos que puede contener;
tales queues son conocidas como delimitadas ( bouded ). Algunas implementaciones Queue en
/ava7util7concurrent son delimitadas, pero las implementaciones en /ava7util no lo son.
El mtodo add, el cual en Queue es heredado de Collection, inserta un elemento a menos que viole
las restriciones de capacidad de la queue, en en dicho caso lanzar una excepcin de tipo
)llealSateE(ception. El mtodo offer, el cual su intencin es que se use solo en queue
delimitadas, difiere de add solo en que india falla al insertar un elemento devolviendo false.
Los mtodos remove y poll ambos remueven y devuelven la cabeza de la queue. El elemento que es
removido esta en funcin de la poltica de ordenamiento de la queue. Los mtodos remove y poll
difieren uno de otro solo en su comportamiento cuando la queue esta vaca. Bajo estas circunstancias,
remove lanza 8oSuchElementE(ception, mientras que poll devuelve null.
Los mtodos element y pee0 devuelven, pero no remueven, la cabeza de la queue. Difieren uno del
otro en precisamente la misma forma que remove y poll: Si la queue est vaca, element lanza
8oSuchElementE(ception, mientras pee0 devuelve null.
Las implementaciones de Queue generalmente no permiten insercin de elementos null. La
implementacin Lin0edList, que se readaptar para implementar Queue, es una excepcin. Por
razones histricas, esta permite elementos null, pero debera abstenerse de tomar ventaja de esto,
debido a que null es usado como un valor especial en los mtodos poll y pee0.
Las implementaciones de Queue generalmente elementos basados en versiones de los mtodos eEuals
y hashCode ya que es su lugar heredan la identidad basada en versiones de .b/ect.
La interface Queue no define mtodos de bloqueo, los cuales son comunes en la programacin
concurrente. Estos mtodos, en los cuales los elementos esperan a que haya espacio disponible, son
definidos en la interface /ava7util7concurrent7,loc0inQueue, la cual es una extensin de
Queue.
El siguiente ejemplo de programa, una queue es utilizada para implementar un contador de tiempo
descendente. La queue es precargada con valores enteros desde un nmero especificado en la linea de
comandos hasta alcanzar el cero, en orden descendente. Entonces, los valores son removidos de la
queue e impresos a intervalos de un segundo. El programa es un poco artificial aunque podra hacerse
mas natural y hacer la misma cosa sin usar una queue, pero ilustra el uso de una queue para almacenar
elementos en un procesamiento prioritario.
import /ava7util7>'
public class Countdo$n *
public static void main%Strin23 ars&
thro$s )nterruptedE(ception *
int time # )nteer7parse)nt% @D;@ &' ++%ars2;3&'
Queue<)nteer> Eueue # ne$ Lin0edList<)nteer>%&'
for %int i # time' i ># ;' i--&
Eueue7add%i&'
$hile %9Eueue7isEmpt"%&& *
S"stem7out7print%Eueue7remove%& A @ @&'
4hread7sleep%C;;;&'
5 ++ fin del $hile
Unidad 3.- Colecciones Elaborado por Oscar Alejandro Gonzlez Bustamante pgina 25 de 34
Colecciones ( paquete java.util ).

5 ++ fin de el mGtodo main
5 ++ fin de la clase Countdo$n
La salida al correr el programa con 20 nmeros enteros es:
run-sinle6
D; CS CR CQ CO CB CP CM CD CC C; S R Q O B P M D C ; ,W)L= SWCCESS?WL %total time6 DC
seconds&
Vea que el programa tarda 21 segundos debido a que va de 20 a 0.
En el siguiente ejemplo, una queue prioritaria es usada para ordenar una coleccin de elementos, De
nuevo este programa es algo artificial y no hay razn para usarlo en lugar del mtodo sort provisto en
Collections, pero ilustra el comportamiento de las queues prioritarias.
static <E> List<E> heapSort%Collection<E> c& *
Queue<E> Eueue # ne$ Friorit"Queue<E>%c&'
List<E> result # ne$ !rra"List<E>%&'
$hile %9Eueue7isEmpt"%&&
result7add%Eueue7remove%&&'
return result'
5
#mplementaciones de *ueue-
)riorit5*ueue
Esta coleccin nos sirve cuando necesitamos establecer prioridades de insercin y eliminacin. Es decir,
si necesitamos que al eliminar un elemento de la cola, cul queremos que se elimine primero? y en caso
de insertar lo mismo. Bueno, para poder establecer este tipo de prioridades est PriorityQueue.
$in8ed$ist
LinkedList adems de implementar List, implementa Queue. y podemos elegirla si necesitamos hacer una
cola simple.
.!.= #nter,az 2ap
Map no es una coleccin y por lo tanto no extiende de Collection. Un Map tiene, por un lado los valores,
y por otro las claves. Cada clave est asociada con un valor. Map no permite claves duplicadas. Puede
haber valores duplicados, pero claves no!.
mplementaciones de Map:
7as12ap
HashMap es unsorted y unordered. As que si se requiere un Map sin importar el orden de sus elementos,
esta es tu coleccin. Un dato a tener en cuenta es que HashMap permite un solo null como clave y
mltiples null como valor.
Unidad 3.- Colecciones Elaborado por Oscar Alejandro Gonzlez Bustamante pgina 26 de 34
Colecciones ( paquete java.util ).

7as1"a4le
Hashtable vendra a ser lo mismo que HashMap, con dos diferencias: sus mtodos son sincronizados,
y no permite ningn valor o clave null.
$in8ed7as2ap
Es ms lento que HashMap para insertar y eliminar elementos, pero ms rpido para iterar sobre ellos.
"ree2ap
TreeMap es ordered y sorted. Es decir, tiene como orden por defecto el orden natural de sus elementos. Y
adems, da la posibilidad de aplicarle un orden personalizado va Comparator o Comparable. Hay que
tener en cuenta a la hora de elegir, que TreeMap es lento.
import /ava7util7>'
public class Ver!rbol*
public static void main%Strin ars23&*
4reeMap<Strin:Strin> lista #
ne$ 4reeMap<Strin:Strin>%&'
++ recuerde Eue los ob/etos Strin tienen orden natural
lista7put%@R@:@Lunes@&'
lista7put%@D@:@Martes@&'
lista7put%@B@:@Viernes@&'
lista7put%@P@:@Xueves@&'
lista7put%@Q@:@=omino@&'
lista7put%@O@:@S<bado@&'
lista7put%@M@:@MiGrcoles@&'
lista7put%@O@:@S<bado@&'
S"stem7out7print%@InLa lista tiene @&'
S"stem7out7println%lista7si-e%&A@ elementos@&'
S"stem7out7print%@La semana I@ordenada " sin@&'
S"stem7out7println%@ repeticionesI@@&'
Collection coleccion # lista7entr"Set%&'
)terator i # coleccion7iterator%&'
$hile%i7has8e(t%&&
S"stem7out7print%i7ne(t%&7toStrin%&A@ @&'
5 ++ fin del mGtodo main
5 ++ fin de la clase Ver!rbol
Salida6
La lista tiene Q elementos
La semana @ordenada " sin repeticiones@
D#Martes M#MiGrcoles P#Xueves B#Viernes O#S<bado Q#=omino R#Lunes
(orted2ap
Unidad 3.- Colecciones Elaborado por Oscar Alejandro Gonzlez Bustamante pgina 27 de 34
Colecciones ( paquete java.util ).

Mapa que mantiene sus asignaciones de clave en orden ascendente. Este es un mapa anlogo a
SortedSet. Este se utiliza para ordenar las colecciones, naturalmente, de clave / valor en pares, tales
como diccionarios y guas telefnicas.
.6 Clase %numeration.
No es una clase sino una interface del paquete java.util. Su firma es :
public interface Enumeration<E>
Un objeto que implementa la interface Enumeration genera una serie de elementos, uno a la vez.
Sucesivas invocaciones a el mtodo ne(tElement devuelven series de elementos sucesivos.
Por ejemplo, para imprimir todos los elementos de un Vector<E> v.
for %Enumeration<E> e # v7elements%&' e7hasMoreElements%&'&
S"stem7out7println%e7ne(tElement%&&'
Hay mtodos provistos para enumerar los elementos de un vector, las llaves de un hashtable, y los
valores en una hashtable. Las enumeraciones tambin son usadas para especificar flujos de entrada a
travs de un SequencenputStream. En el ejemplo se ve el mtodo hasMoreElements%& que prueba si
la enumeracin contiene mas elementos y devuelve un true si hay mas y un false si ya no hay, el
mtodo ne(tElement%& devuelve el siguiente elemento de la enumeracin si esta enumeracin tiene
por lo menos un elemento que proveer.
Note que la funcionalidad de esta interface es duplicada por la interface terator. Adems, la interface
terator agrega la operacion adicional remove, y tiene mtodos con nombres mas cortos. Las nuevas
implementaciones deberan considerar usar terator en lugar de Enumeration.
. Clase #terator.
No es una clase sino una interface del paquete java.util. Su firma es :
public interface )terator<E>
La inteface iterador es:
public interface terator <E> {
boolean hasNext();
Object next();
void remove();
}
Unidad 3.- Colecciones Elaborado por Oscar Alejandro Gonzlez Bustamante pgina 28 de 34
Colecciones ( paquete java.util ).

La interfaz /ava7util7)terator se usa para recorrer las colecciones posicionales.
La interfaz terator toma el lugar de la interfaz Enumeration en el framework de Java collections. Un
terator se diferencia de las enumeraciones de dos maneras:
terator permite al invocador remover elementos de la coleccion durante la iteracin con una
semantica bien definida.
Los nombres de los mtodos han sido mejorados ( son mas cortos ).
Los mtodos son:
boolean has8e(t%& Devuelve true si la iteracin tiene mas elementos.
E ne(t%& Devuelve el siguiente elemento en la iteracin, si en la iteracin ya no hay mas elementos
lanza la excepcin 8oSuchElmentE(ception.
void remove%& Remueve de la coleccin el ltimo elemento devuelto pro el iterator ( operacin
opcional ). Este mtodo debe ser invocado una vez por envocacin a ne(t. Su comportamiento
en un iterador no esta especificado si la coleccin es modificada mientras la iteracin esta en
progreso en alguna forma diferente a la de invocar a este mtodo.

Ejemplo
:
)nterator it # puntos7iterator%&'
$hile %it7has8e(t%&& *
FointD= p # %FointD=& it7ne(t%&'
canvas7dra$%p&'
5
.: Al.oritmos de la clase Collections.
El framework del Java Collections provee mtodos estticos en la clase Collections que pueden ser usados para
ordenar una lista. Tambin contiene mtodos como binar"Search, reverse, shuffle, cop", y mtodos como
fill para listas, y ma(, min, dis/oint, y frequency para las colecciones.
La figura siguiente vemos el diagrama UML de clase de /ava7util7Collections con sus mtodos estticos
para manipular listas y colecciones.
Unidad 3.- Colecciones Elaborado por Oscar Alejandro Gonzlez Bustamante pgina 29 de 34
Colecciones ( paquete java.util ).

Figura donde se aprecian los mtodos estticos de java.util.Collections
.:.! Al.oritmo sort.
Con el mtodo sort se pueden comparar elementos en una lista en su orden natural a travs del mtodo compare4o
y la interface Comparable. Se pueden especificar el comparador para ordenar los elementos. Por ejemplo, el
siguiente fragmento de cdigo ordena cadenas en una lista:
List<Strin> list # !rra"s7asList%@red@: @reen@: @blue@&'
Collections7sort%list&'
S"stem7out7print%list&'
La salida es:
2blue: reen: red3
El anterior cdigo ordenaba una lista en orden ascendente. Para ordenarla en orden descendente, simplemente use
el mtodo Collections.reverseOrder() que devuelve un objeto Comparator que ordena los elementos en orden
inverso. Por ejemplo, el siguiente fragmento de cdigo ordena una lista de cadenas en orden descendente:
List<Strin> list # !rra"s7asList%@reen@: @red@: @"ello$@: @blue@&'
Collections7sort%list: Collections7reverse.rder%&&'
S"stem7out7print%list&'
La salida es:
2"ello$: red: reen: blue3
Unidad 3.- Colecciones Elaborado por Oscar Alejandro Gonzlez Bustamante pgina 30 de 34
Colecciones ( paquete java.util ).

.:.6 Al.oritmo s1u,,le.
Se puede desordenar o revolver los elementos de una lista con el mtodo shuffle% List & el cul
reacomoda los elementos en forma aleatoria en una lista. Por ejemplo el siguiente cdigo revuelve los
elementos en la lista.
List<Strin> list # !rra"s7asList%@"ello$@: @red@: @reen@: @blue@&'
Collections7shuffle%list&'
S"stem7out7println%list&'
Tambin se puede usar el mtodo shuffle% List: Landom & para reordenar aleatoriamente los
elementos de la lista mediante un objeto Landom especifico. Usando un objeto Landom especfico es til
para generar una lista con secuencias idnticas de elementos de la misma lista original. Por ejemplo, el
siguiente fragmento de cdigo, revuelve los elementos en la lista:
List<Strin> listC # !rra"s7asList%@"ello$@: @red@: @reen@: @blue@&'
List<Strin> listD # !rra"s7asList%@"ello$@: @red@: @reen@: @blue@&'
Collections7shuffle%listC: ne$ Landom%D;&&'
Collections7shuffle%listD: ne$ Landom%D;&&'
S"stem7out7println%listC&'
S"stem7out7println%listD&'
Lo que se vera es que listC y listD tienen la misma secuencia de elementos antes y despues de la
revoltura.
.:. Al.oritmos reverse> ,ill> cop5> ma; 5 min.
El algoritmo reverse para invertir los elementos de una lista. Por ejemplo, el siguiente fragmento de
cdigo desplegar [blue, green, red, yellow] :
List<Strin> list # !rra"s7asList%@"ello$@: @red@: @reen@: @blue@&'
Collections7reverse%list&'
S"stem7out7println%list&'
Puede usar el mtodo fill% List list: .b/ect o & para remplazar todos los elementos en una lista con
el elemento especificado. Por ejemplo, el siguiente fragmento de cdigo despliega 2blac0: blac0: blac03 .
List<Strin> list # !rra"s7asList%@red@: @reen@: @blue@&'
Collections7fill%list: @blac0@&'
S"stem7out7println%list&'
Se puede usar el mtodo cop"% dest: src & para copiar todos los elementos de una lista origen src a una lista
destino dest con el mismo indice. La lista destino debe ser igual de larga que la lista origen. Si esta es mas
grande, los elementos restantes en la lista origen no srn afectados. Por ejemplo, el siguiente fragmento de cdigo
copia la lista listD a la lista listC :
List<Strin> listC # !rra"s7asList%@"ello$@: @red@: @reen@: @blue@&'
List<Strin> listD # !rra"s7asList%@$hite@: @blac0@&'
Collections7cop"%listC: listD&'
Unidad 3.- Colecciones Elaborado por Oscar Alejandro Gonzlez Bustamante pgina 31 de 34
Colecciones ( paquete java.util ).

S"stem7out7println%listC&'
La salida de listC es 2$hite: blac0: reen: blue3. El mtodo copy ejecuta una copia de sombra. Solo
las referencias de los elementos de la lista origen son copiados.
Se puede usar el mtodo nCopies%int n: .b/ect o & para crear una lista inmutable( no cambiante ), que
consista en n copias del objeto especificado. Por ejemplo, el siugiente cdigo crea una lista de cinco objetos
Calendar.
List<HreorianCalendar> listC # Collections7nCopies
%B: ne$ HreorianCalendar%D;;B: ;: C&&'
La lista creada con el mtodo nCopies es inmutable, asi que no puede agregar o remover, o actualizar los
elementos en la lista. Todos los elementos tienen la mismas referencias.
Se pueden usar los mtodos ma( y min para encontrar el elemento mximo y mnimo en una coleccin. Los
elementos deben ser comparables usando la interface Comparable o la interface Comparator. Por ejemplo, el
siguiente cdigo despliega la cadena mas grande y pequea en una coleccin.
Collection<Strin> collection # !rra"s7asList%@red@: @reen@: @blue@&'
S"stem7out7println%Collections7ma(%collection&&'
S"stem7out7println%Collections7min%collection&&'
.:.: Al.oritmo 4inar5(earc1.
Se puede usar el mtodo binar"Search para buscar un elemento mediante una llave en una lista. La lista
debe ser previamente ordenada en orden creciente. Si la llave no esta en la lista, el mtodo devuelve - % punto
de inserciJn A C &. Recordemos que el punto de insercin es el punto donde el elemento estara si estubiera
presente. Por ejemplo, en el siguiente fragmento de cdigo se busca las llaves en una lista de entereos y una lista
de cadenas:
List<)nteer> listC # !rra"s7asList%D: P: Q: C;: CC: PB: B;: BS: O;: OO&'
S"stem7out7println%@%C& )nde(6 @ A Collections7binar"Search%listC: Q&&'
S"stem7out7println%@%D& )nde(6 @ A Collections7binar"Search%listC: S&&'
List<Strin> listD # !rra"s7asList%@blue@: @reen@: @red@&'
S"stem7out7println%@%M& )nde(6 @ A Collections7binar"Search%listD: @red@&&'
S"stem7out7println%@%P& )nde(6 @ A Collections7binar"Search%listD: @c"an@&&'
La salida del cdigo anterior es:
%C& )nde(6 D
%D& )nde(6 P
%M& )nde(6 D
'8( +nde9: :,
Unidad 3.- Colecciones Elaborado por Oscar Alejandro Gonzlez Bustamante pgina 32 de 34
Colecciones ( paquete java.util ).

Referencias.
Big Java
Cay Horstmann
2da. Edicin. John Wiley & Sons, nc. USA.
Programacin en Java 2
Jess Snchez Allende y otros autores.
1ra. Edicin McGraw-Hill / nteramericana de Espaa S.A.U.
ntroduction to Java Programming
Y. Daniel Liang.
6ta. Edicin. 2007 Pearson Education, nc.
Unidad 3.- Colecciones Elaborado por Oscar Alejandro Gonzlez Bustamante pgina 33 de 34
Colecciones ( paquete java.util ).

Java Avanzado
<erec1os &eservados
Unidad 3.- Colecciones Elaborado por Oscar Alejandro Gonzlez Bustamante pgina 34 de 34