Está en la página 1de 13

Colecciones en Java (Java Collections)

La API de Colecciones (Colleections) de Java provee a los desarrolladores con un conjunto de clases e interfaces que facilitan la tarea de manejar colecciones de objetos. En cierto sentido, las colecciones trabajan como los arreglos, la diferencia es que su tamao puede cambiar din micamente ! cuentan con un comportamiento "m#todos$ m s avan%ado que los arreglos. La ma!or&a de las colecciones de Java se encuentran en el paquete java.util.

Iterable
La interfa% Iterable es una de las interfaces ra&% de las clases de colecciones. La interfa% Collection 'ereda de Iterable, as& que todos los subtipos de Collection tambien implementan la interfa% Iterable. (na clase que implementa la interfa% Iterable puede ser usada con el nuevo ciclo for. A continuaci)n se muestra un ejemplo de dic'o ciclo*
List list = new ArrayList(); for(Object o : list){ //hacer al o con o; !

La interfa% Iterable +nicamente tiene un m#todo*


"ublic interface Iterable#$% { "ublic Iterator#$% iterator(); !

Collection
La interfa% Collection es otra de las interfaces ra&% de las clases de colecciones de Java. Aunque no es posible instanciar de manera directa una Colecci)n, en lugar de eso se instanc&a un subtipo de Colecci)n "una lista por ejemplo$, de manera recurrente querremos tratar a estos subtipos de manera uniforme como una Colecci)n. Las siguientes interfaces "tipos de colecci)n$ 'eredan de la interfa% Collection* List ,et ,orted,et -avigable,et .ueue /eque

Java no inclu!e una implementaci)n utili%able de la interfa% Collection, as& que se tendr que usar alguno de los subtipos mencionados. La interfa% Collection "como cualquier otra interfa%$ +nicamente define un grupo de m#todos "comportamiento$ que compartiran cada uno de los subtipos de dic'a interfa%. Lo anterior, 'ace posible el ignorar el tipo espec&fico de colecci)n que se est usando ! se puede tratar como una colecci)n gen#rica "Collection$. Aqu& se muestra un m#todo que opera sobre un Collection*
"ublic class &je'"lo(ollection{ "ublic static voi) hacerAl o((ollection collection) { Iterator itera)or = collection.iterator(); while(itera)or.has*e+t()){ Object object = itera)or.ne+t(); //hacer al o con object a,ui... ! ! !

A continuaci)n, se muestran algunas formas de llamar este m#todo con diferentes subtipos de Collection*
-et conjunto = new .ash-et(); List lista = new ArrayList(); &je'"lo(ollection.hacerAl o(conjunto); &je'"lo(ollection.hacerAl o(lista);

,in importar el subtipo de Collection que se est# utili%ando, e0isten algunos m#todos comunes para agregar ! quitar elementos de una colecci)n*
-trin ca)ena = /&sto es una ca)ena )e te+to/; (ollection coleccion = new .ash-et(); boolean hubo0n(a'bio = coleccion.a))(ca)ena); boolean se&li'ino&le'ento = coleccion.re'ove(ca)ena);

a))() agrega el elemento dado a la colecci)n ! regresa un valor verdadero "true$ si la colecci)n cambi) como resultado del llamado al m#todo add"$. (n conjunto " set$ por ejemplo, podr&a no 'aber cambiado !a que, si el conjunto !a conten&a el elemento, dic'o elemento no se agrega de nuevo. Por otro lado, si el m#todo add"$ fue llamado con una lista " List$ ! la lista !a conten&a el elemento, dic'o elemento se agrega de nuevo ! a'ora e0istir n 1 elementos iguales dentro de la lista. re'ove() quita el elemento dado ! regresa un valor verdadero si el elemento estaba presente en la colecci)n ! fue removido. ,i el elemento no estaba presente, el m#todo remove"$ regresa falso "false$. 2ambi#n se pueden agregar ! remover colecciones de objetos. Aqu& 'a! algunos ejemplos*

-et un(onjunto = ... // se a re an los ele'entos )el conjunto a,u1 List unaLista = ... // se a re an los ele'entos )e la lista a,u1 (ollection coleccion = new .ash-et(); coleccion.a))All(un(onjunto); //a,u1 ta'bi2n se re resa un booleano "ero lo coleccion.a))All(unaLista); //esta'os i noran)o coleccion.re'oveAll(unaLista); //ta'bi2n re resa booleano... coleccion.retainAll(un(onjunto); //ta'bi2n re resa booleano...

a))All() agrega todos los elementos encontrados en la colecci)n pasada como argumento al m#todo. El objeto colecci)n no es agregado, s)lamente sus elementos. ,i en lugar de utili%ar addAll"$ se 'ubiera utili%ado add"$, entonces el objeto colecci)n se 'abr&a agregado ! no sus elementos individualmente.

E0actamente c)mo se comporta el m#todo addAll"$ depende del subtipo de colecci)n. Algunos subtipos de colecci)n permiten que el mismo elemento sea agregado varias veces "listas$, otros no "conjuntos$. re'oveAll() elimina todos los elementos encontrados en la colecci)n pasada como argumento al m#todo. ,i la colecci)n pasada como argumento inclu!e algunso elementos que no se encuentran en la colecci)n objetivo, simplemente se ignoran. retainAll() 'ace lo contrario que removeAll"$. En lugar de quitar los elementos encontrados en la colecci)n argumento, retiene todos estos elementos ! quita cualquier otro elemento que no se encuentre en la colecci)n argumento. 3a! que tener en cuenta que, si los elementos !a se encontraban en la colecci)n objetivo, estos son retenidos. Cualquier nuevo elemento encontrado en la colecci)n argumento que no se encuentre en la colecci)n objetivo no se agrega autom ticamente, s&mplente se ignora.

4eamos un ejemplo utili%ando pseudo5c)digo*


(ollection colA = 3A454(6 (ollection col5 = 3748496 (ollection objetivo = 36; objetivo.a))All(colA); objetivo.a))All(col5); objetivo.retainAll(col5); objetivo.re'oveAll(colA); objetivo.re'oveAll(col5); //objetivo ahora contiene 3A454(6 //objetivo ahora contiene 3A454(4748496 //objetivo ahora contiene 3748496 //no "asa na)a4 los ele'entos ya se hab1an ,uita)o //objetivo ahora est: vac1a

La interfa% Collection tiene dos m#todos para revisar si una colecci)n contiene uno o m s elementos. Estos m#todos son cantains"$ ! containsAll"$. A continuaci)n se ilustran*
(ollection coleccion = new .ash-et(); boolean contiene&le'ento = coleccion.contains("un elemento"); (ollection ele'entos boolean contiene$o)os = new .ash-et(); = collection.containsAll(elementos);

contains() regresa verdadero si la colecci)n inclu!e el elemento ! falso si no es as&. containsAll() regresa verdadero si la colecci)n contiene todos los elementos de la colecci)n argumento ! falso si no es as&.

,e puede revisar el tamao de una colecci)n utili%ando el m#todo si%e"$. El tamao de una colecci)n indica el n+mero de elementos que contiene. (n ejemplo*
int nu'ero&le'entos = coleccion.si;e();

2ambi#n se puede utili%ar el nuevo ciclo for*


(ollection coleccion = new .ash-et(); //... a re a ele'entos a la colecci<n for(Object objecto : coleccion) { //hacer al o con objecto; !

Es posible generificar los varios tipos ! subtipos de Colecciones "Collection$ ! 6apas "6ap$ de la siguiente maner*
(ollection#-trin % coleccion(a)enas = new .ash-et#-trin %();

Esta 7coleccionCadenas8 a'ora +nicamente puede contener instancias u objetos del tipo ,tring. ,i se trata de agregar cualquier otra cosa, o 'acer un cast de los elementos en la colecci)n a cualquier otro tipo que no sea ,tring, se arrojar un error de compilaci)n. ,e puede iterar la colecci)n mostrada anteriormente utili%ando el nuevo ciclo for*
(ollection#-trin % coleccion(a)enas = new .ash-et#-trin %(); for(-trin ca)ena : coleccion(a)enas) { //hacer al o con ca)a =ca)ena> !

Listas (List)
Las listas representan una lista ordenada de objetos, lo cual quiere decir que se pueden accesar los elementos en un orden espec&fico o mediante un &ndice "index$. En una lista se puede agregar el mismo elemento m s de una ve%. Implementaciones de Listas Al ser un subtipo de la interfa% Collection, todos los m#todos de Collection tambi#n se encuentran disponibles en la interfas Lista "List$. Como List es una interfa%, es necesario instanciar un implementaci)n concreta de la interfa% para poder utili%arla. E0isten varias implementaciones de la interfa% List en el API de Java*
List List List List

java.util.Arra!List java.util.Lin9edList java.util.4ector java.util.,tac9


listaA lista5 lista( listaA = = = = new new new new ArrayList(); Lin?e)List(); @ector(); -tac?();

Para agregar elementos a un lista se llama su m#todo add"$. Este m#todo es 'eredado de la interfa% Collection. Algunos ejemplos*
List listaA = new ArrayList(); listaA.a))(/ele'ento 7/); listaA.a))(/ele'ento 8/); listaA.a))(/ele'ento 9/); listaA.a))(B4 /ele'ento B/);

El orden en el cual se agregan los elementos a la lista es almacenado, de manera que se puede accesar a dic'os elementos en el mismo orden. Para #sto, se puede utili%ar el m#todo get"&ndice$ o a trav#s de un iterador regresado por el m#todo iterator"$*
List listaA = new ArrayList(); listaA.a))(/ele'ento B/); listaA.a))(/ele'ento 7/); listaA.a))(/ele'ento 8/); //access via in)e+ -trin ele'entoB = listaA. et(B); -trin ele'ento7 = listaA. et(7); -trin ele'ento9 = listaA. et(8); //acceso 'e)iante un itera)or Iterator itera)or = listaA.iterator();

while(itera)or.has*e+t(){ -trin ele'ento = (-trin ) itera)or.ne+t(); ! //acceso 'e)iante un ciclo for nuevo: for(Object objecto : listaA) { -trin ele'ento = (-trin ) objecto; !

,e pueden quitar elementos utili%ando*:ou can remove elements in t;o ;a!s* re'ove(Object ele'ento) remueve el elemento de la lista si est presente. 2odos los elementos de la lista se mueven un lugar 'acia arriba de manera que, todos sus &ndices se reducen en <. re'ove(int in)ice) removes t'e element at t'e given inde0. All subsequent elements in t'e list are t'en moved up in t'e list. 2'eir inde0 t'us decreases b! <.

Listas Genricas Por default se puede poner cualquier tipo de objeto en una lista, pero a partir de Java = "la versi)n actual es la >$, 7Java ?enerics8 'ace posible limitar los tipos de objeto que se pueden insertar en una lista, por ejemplo*
List#CyObject% lista = new ArrayList#CyObject%();

Esta lista a'ora s)lo puede tener instancias de la clase CyObject dentro de ella. ,e puede entonces accesar e iterar estos elementos sin necesidad de 'acer un casting*
CyObject unObjeto = lista. et(B); for(CyObject unObjeto : lista){ //hacer al o con anObjeto... !

Queue (Colas)
La interfa% .ueue "java.util..ueue$ es un subtipo de la interfa% Collection, representa una lista ordenada de objetos justo como List pero su uso es lig#ramente distinto. (na cola est diseada para tener sus elementos insertados al final de la cola ! removidos del inicio. Justo como una fila de banco o de supermercado. Al ser un subtipo de Collection, todos los m#todos de Collection tambi#n se encuentran disponibles en la interfa% .ueue. Como .ueue es una interfa%, es necesario instanciar una implementaci)n concreta para poder utili%arla. E0isten 1 clases en el API de Java que implementan la interfa% .ueue* java.util.Lin9edList java.util.Priorit!.ueue Lin?e)List es una implementaci)n es una implementaci)n est ndar de una cola.

DriorityEueue guarda sus elementos internamente de acuerdo a su orden natural "si implementan la interfa% Comparable$, o de acuerdo a un Comparador "Comparator$ pasado a Priorit!.ueue. Aqu& 'a! algunos ejemplos de c)mo crear una instancia de .ueue*
Eueue colaA = new Lin?e)List(); Eueue cola5 = new DriorityEueue();

Para agregar elementos a una cola, se llama su m#todo add"$. Este m#todo se 'ereda de la interfa% Collection*
Eueue colaA = new Lin?e)List(); colaA.a))(/ele'ento 7/); colaA.a))(/ele'ento 8/); colaA.a))(/ele'ento 9/);

El orden en el cual los elementos se agregan a .ueue es almacenado internamente ! depende de la implementaci)n. Esto mismo es cierto para el orden en el cual los elementos son obtenidos "removidos$ de la cola. ,e puede observar cu l es el elemento que se encuentra a la 7cabe%a8 de la cola sin quitarlo utili%ando el m#todo element"$*
Object first&le'ent = ,ueueA.ele'ent();

Para quitar el primer elemento de la cola, se utili%a el m#todo remove"$. 2ambi#n es posible iterar todos los elmentos de la cola, en lugar de procesarlos uno a la ve%*
Eueue colaA = new Lin?e)List(); colaA.a))(/ele'ento B/); colaA.a))(/ele'ento 7/); colaA.a))(/ele'ento 8/); //acceso con itera)or Iterator itera)or = colaA.iterator(); while(itera)or.has*e+t(){ -trin ele'ento = (-trin ) itera)or.ne+t(); ! //acceso con ciclo for for(Object objecto : colaA) { -trin ele'ento = (-trin ) objecto; !

Para remover "quitar$ elementos de la cola, se llama el m#todo remove"$. @ste m#todo quita el elemento que se encuentra a la 7cabe%a8 de la cola*
Object "ri'er&le'ento = colaA.re'ove();

Colas Genricas Por default, se puede poner cualquier tipo de objeto dentro de una cola, pero a partir de Java =, es posible limitar el tipo de objetos que se pueden insertar en .ueue*
Eueue#CyObject% cola = new Lin?e)List#CyObject%();

Esta cola +nicamente podra tener instancias CyObject dentro de ella. ,e puede accesar e iterar los elementos sin reali%ar casting*
CyObject unObjecto = cola.re'ove(); for(CyObject unObjeto : cola){ //hacer al o con unObjecto... !

Deque
La interfa% /eque "java.util./eque$ es un subtipo de la interfa% .ueue. Aepresenta un tipo de cola en la cual se pueden insertar ! remover elementos de ambos lados. Por lo tanto, 7/eque8 es la versi)n corta de 7/ouble Ended .ueue8 o Cola de 1 lados. Al ser un subtipo de .ueue, todos los m#todos de .ueue ! Collection se encuentran disponibles en /eque. Como /eque es una interfa%, es necesario instanciar una implementaci)n concreta de la interfa% para poder utili%arla. E0isten 1 clases en el API de Java que implementan la interfa% /eque* java.util.Arra!/eque java.util.Lin9edList Lin?e)List es una implementaci)n est ndar de .ueue ! /eque. ArrayAe,ue almacena sus elementos internamente en un arreglo. ,i el n+mero de elementos e0cede el espacio en el arreglo, se crea uno nuevo ! todos los elementos se copian de uno al otro. Ejemplos sobre c)mo instanciar un /eque*
Ae,ue )e,ueA = new Lin?e)List(); Ae,ue )e,ue5 = new ArrayAe,ue();

Para agregar elementos a la 7cola8 del /eque se utili%a el m#todo add"$. 2ambi#n se pueden utili%ar los m#todos addBirst"$ ! addLast"$ para agregar elementos a la 7cabe%a8 ! la 7cola8 del /eque respectivamente.
Ae,ue )e,ueA = new Lin?e)List(); )e,ueA.a)) (/ele'ento 7/); //a re ar ele'ento al final )e,ueA.a))First(/ele'ento 8/); //a re ar ele'ento a la cabe;a )e,ueA.a))Last (/ele'ento 9/); //a re ar ele'ento al filnal

El orden en el cual se agregan los elementos al /eque se almacena internamente ! depende de la implementaci)n. Las dos implementaciones mencionadas anteriormente almacenan sus elementos en el orden en el que fueron insertados.

,e puede observar el elemento que se encuentra a la cabe%a del /eque sin quitarlo utili%ando el m#todo element"$. Adicionalmente, se pueden u9tili%ar los m#todos getBirst"$ ! getLast"$, los cuales regresan el primer ! el +ltimo elemento del /eque*
Object "ri'er&le'ento = )e,ueA.ele'ent(); Object "ri'er&le'ento = )e,ueA. etFirst(); Object ulti'o&le'ento = )e,ueA. etLast();

2ambi#n se pueden iterar los elementos del dque, en lugar de procesarlos uno a la ve%*
Ae,ue )e,ueA = new Lin?e)List(); )e,ueA.a))(/ele'ento B/); )e,ueA.a))(/ele'ento 7/); )e,ueA.a))(/ele'ento 8/); //acceso con itera)or Iterator itera)or = )e,ueA.iterator(); while(itera)or.has*e+t(){ -trin ele'ento = (-trin ) itera)or.ne+t(); ! //acceso con ciclo for for(Object objecto : )e,ueA) { -trin ele'ento = (-trin ) objecto; !

Cuando se itera el deque mediante su iterador o mediante el ciclo for, la secuencia en la cual se iteran los elementos depende de la implementaci)n. Para remover elementos de un deque, se utili%an los m#todos remove"$, removeBirst"$ ! removeLast"$*
Object "ri'er&le'ent = )e,ueA.re'ove(); Object "ri'er&le'ent = )e,ueA.re'oveFirst(); Object ulti'o&le'ent = )e,ueA.re'oveLast();

Deque Genrico Por default, se puede poner cualquier tipo de objeto dentro de un deque, pero a partir de Java =, es posible limitar el tipo de objetos que se pueden insertar en /eque*
Ae,ue#CyObject% )e,ue = new Lin?e)List#CyObject%();

Este deque +nicamente podra tener instancias CyObject dentro de #l. ,e puede accesar e iterar los elementos sin reali%ar casting*
CyObject unObjecto = )e,ue.re'ove(); for(CyObject unObjeto : )e,ue){ //hacer al o con unObjecto... !

Pilas (Stack)
La clase ,tac9 "java.util.,tac9$ merece una breve e0plicaci)n propia. El uso t&pico de una Pila o ,tac9 no es como el de una lista com+n.

(n stac9 es una estrucutra de datos en la cual se agregan elementos al 7tope8 del stac9, ! tambi#n se quitan elementos del 7tope8. A este enfoque se le llama 7Cltimo que entra, primero que sale8 o LIBD (Last in, First out). In contraste, una cola "queue$ utili%a un enfoca 7Primero que entra, primero que sale8 o BIBD "7Birst in, Birst out8$. ,e muestra un ejemplo para crear un ,tac9*
-tac? stac? = new -tac?(); stac?."ush(/7/); stac?."ush(/8/); stac?."ush(/9/); //observar el ele'ento en el to"e )el stac? sin sacarlo. Object obj$o" = stac?."ee?(); Object obj9 = stac?."o"(); //la ca)ena /9/ est: en el to"e )el stac?. Object obj8 = stac?."o"(); //la ca)ena /8/ est: en el to"e )el stac?. Object obj7 = stac?."o"(); //la ca)ena /7/ est: en el to"e )el stac?.

"ush() 7empuja8 un objeto al tope del stac9. "ee?() regresa el objeto en el tope del stac9 pero sin sacarlo. "o"() regresa el objeto en el tope del stac9, removi#ndolo.

,e puede buscar un objeto dentro del stac9 para obtener su &ndice utili%ando el m#todo searc'"$. ,e llama al m#todo equals"$ de cada objeto del stac9 para determinar si el objeto buscado est presente en el stac9. El &ndice que se obtiene es el &ndice a partir del tope el stac9, lo cual significa que un elemento con &ndice < se encuentra en el tope*
-tac? stac? = new -tac?(); stac?."ush(/7/); stac?."ush(/8/); stac?."ush(/9/); int index = stack.search("3"); //in)e+ = 9

Set (Conjuntos)
La interface ,et representa un conjunto de objetos, lo cual significa que cada elemento puede e0istir s)lamente una ve% en el ,et. Implementaciones de ,et Al ser un subtipo de Collection, todos los m#todos de Collection se encuentran disponibles en ,et. Como ,et es una interface, es necesario instanciar una implementaci)n contreta de la interfa% para poder usarla. E0isten varias clases en el API de Java que implementan la interfa% ,et* java.util.Enum,et java.util.3as',et

java.util.Lin9ed3as',et java.util.2ree,et
-et -et -et -et setA set5 set( setA = = = = new new new new &nu'-et(); .ash-et(); Lin?e).ash-et(); $ree-et();

Cada una de estas implementaciones se comporta de manera ligeramente distinta respecto al orden de los elementos cuando se itera el ,et, ! en el tiempo que toma el insertar ! agregar elementos a los sets. .ash-et es respaldado por un .ashCa". -o garanti%a la secuencia de los elementos cuando #stos son iterados. Lin?e).ash-et difiere de un .ash-et !a que garanti%a que el orden de los elementos durante la iteraci)n, es el mismo orden en el cual fueron insertados. Aeinsertar un elemento que !a se encontraba en el Lin9ed3as',et no cambia su orden. $ree-et tambi#n garanti%a el orden de los elementos al iterarlos, pero el roden es el orden de ordenamiento de los elementos. En otras palabras, el roden en el cual dic'os elementos se almacenar&an si se utili%ara el m#todo Collections.sort"$ en una lista o arreglo que contenga dic'os elementos. Este orden es determinado por su orden natural "si implementan la interfa% Comparable$ o mediante un comparador "Comparator$ espec&fico para la implementaci)n. Cuando se iteran los elementos de un ,et el orden de los elementos depende de cu l implementaci)n de ,et se utili%e como se mencion) anteriormente. (n ejemplo de uso*
-et setA = new .ash-et(); setA.a))(/ele'ento B/); setA.a))(/ele'ento 7/); setA.a))(/ele'ento 8/); //acceso 'e)iante itera)or Iterator itera)or = setA.iterator(); while(itera)or.has*e+t(){ -trin ele'ento = (-trin ) itera)or.ne+t(); ! //acceso 'e)iante ciclo for for(Object objecto : setA) { -trin ele'ento = (-trin ) objecto; !

Los elementos se remueven llamando al m#todo remove"Dbject o$. -o 'a! manera de remover un objeto mediante un &ndice en un ,et !a que el orden de los elementos depende de la implementaci)n. Sets Genricos Por default se puede almacenar cualquier tipo de objeto en un ,et, sin embargo, es posible limitar el tipo de objetos que se pueden insertar mediante el uso de gen#ricos. (n ejemplo*
-et#CyObject% set = new .ash-et#CyObject%();

Este ,et a'ora +nicamente puede tener instancias CyObject dentro de #l. ,e puede accesar e iterar sus elementos sin reali%ar casting*
for(CyObject anObject : set){ //)o so'etin to anObject... !

Sorted Set (Sets ordenados) La intefa% ,orted,et "java.util.,orted,eet$ es un subtipo de la interfa% ,et. ,e comporta como un set normal con la e0cepci)n de que los elementos se ordenan internamente. Esto significa que cuando se iteran los elementos de un ,orted,et los elementos se regresan de manera ordenada. El ordenamiento es el rodenamiento natural de los elementos "si implementan java.lang.Comparable$, o el orden determinado por un Comparator que se le puede proporcionar al ,orted,et. Por default los elementos son iterados en orden ascendente, empe%ando con el 7m s c'ico8 ! movi#ndose 'acia el 7m s grande8. Pero tambi#n es posible iterar los elementos en orden descendente utili%ando el m#todo descendingIterator"$. En el API de Java e0iste +nicamente una clase que implementa ,orted,et* java.util.2ree,et. (n par de ejemplos sobre c)mo instanciar un ,orted,et*
-orte)-et setOr)ena)oA = new $ree-et(); (o'"arator co'"ara)or = new Cy(o'"arator(); -orte)-et setOr)ena)o5 = new $ree-et(co'"ara)or);

Clase Collections
La clase Collections "no confundir con la interfa% Collection$ consiste e0clusivamente de m#todos est ticos que operan sobre colecciones. Contiene algoritmos pol!m)rficos que operan sobre colecci)nes, los cuales regresan una nueva colecci)n respaldada por la colecci)n original. Los meodos de esta clase arrojan -ullPointerE0ception si las colecciones prove&das a los m#todos como argumentos son null. Los algoritmos 7destructivos8 contenidos en esta clase, es decir, los algoritmos que modifican la colecci)n sobre la cual operan, arrojan (nsuportedDperationE0ception si la colecci)n no soporta la mutaci)n apropiada de los primitivos. Algunos ejemplos de m#todos de la clase Collections* void cop!"List, List$ boolean disjoint"Collection, Collection$ Dbject ma0"Collection$ void reverse"List$

void sort"List$ Algunos ejemplos de la utili%aci)n de los m#todos de la clase Collections*

List lista = new Lin?e)List(); lista.a))(=Guan>); lista.a))(=Luis>); lista.a))(=A)rian>); lista.a))(=(he?o>); lista.a))(=Ho)olfo>); (ollections.sort(lista); List lista8 = new Lin?e)List(); (ollections.co"y(lista4 lista8);

También podría gustarte