Sei sulla pagina 1di 8

15/10/2015

Conoce300::PascalconFreePascal::Listasycolecciones::Creandoymanejandocolecciones

LENGUAJESDEPROGRAMACIN

PASCALCONFREEPASCAL
DescargarLibrosGratis?

EncuentreHasta1MillndeLibros.
VariosFormatos.DescargarGratis!

13.Listasycolecciones.

13.3.Creandoymanejandocolecciones.

anterior::indice::siguiente

13.1.Introduccin.
13.2.Creandoymanejandolistas.
13.3.Creandoymanejandocolecciones.

13.4.Excepcionesenlistasycolecciones.
13.5.Generalizacindelistasycolecciones.
13.6.Agregacinycomposicindelistasy
colecciones.

13.7.Polimorfismoenlistasycolecciones.
13.8.Ordenandolistasycolecciones.

LascoleccionesTCollection,tienenlosmtodosypropiedadesnecesariosparasumanipulacincomosonaadir,insertar,borrar
elementos de una lista y otros ms. Pero a diferencia de TFPList y Tlist, estos elementos deben ser clases heredadas de
TColecctionItem.
Las colecciones se usan para representar listas de objetos que sean muy comunes entre ellos, como por ejemplo una lista de
aviones,unalistadecarrosperonounalistadeavionesymascotas.Esdeciralmomentodecrearunacoleccin,sedebedefinir
cual ser la clase padre al cual van a pertenecer todos los objetos de la coleccin. Esta clase padre debe ser siempre una
subclasedelaclaseTCollectionItem.
EnlasiguientetablaseexplicabrevementealgunosmtodosdelascoleccionesTCollection.

Mtodo
Create(i)
Add

Descripcin
Constructor modificado, que permite crear una coleccin. El parmetro i se usa
paraindicarlaclasepadredelcualsernlosobjetosdelacoleccin.
Permite crear y aadir al final un objeto nuevo a la coleccin. Devuelve una
instanciadelaclasepadre.

Insert(i)

Permite crear e insertar un objeto nuevo en la posicin indicada por i. Devuelve


unainstanciadelaclasepadre.

Delete(i)

Borraodestruyeunobjetodescendientedelaclasepadre,enlaposicinindicada
pori.

Exchange(i,j)

Permiteintercambiardosobjetosdelacoleccinindicadosporiyj.

Clear

Borratodoslosobjetosdelacoleccinllamandoasudestructorcorrespondiente.

Items[i]

Esunatributoquenospermiteaccederaunobjeto.Silousamosparaasignarloa
otro objeto de fuera de la coleccin devolver un objeto de la clase
TCollectionItem.Porejemplo:

obj:=coleccion.items[3]

Es importante que obj, sea un objeto descendiente de la clase padre de la


coleccin.
Perosilousamosparaasignarunobjetoaotroobjetodelacoleccinesteusar
elmtodoAssignparaasignarlosatributosdelobjeto.PorEjemplo:

coleccin.items[3]:=obj

Esimportantequeelobjetoquesequieraasignaraunobjetodelacoleccinsea
descendiente de la clase padre de la coleccin y que el mtodo Assign
TCollectionItem deba ser sobrescrito, con los mecanismos para asignar sus
atributoscorrespondientes.
Las colecciones se enumeran empezando con 0. Es decir el primer objeto de la
coleccinesItems[0].

Count

Esunatributoquenosindicalacantidaddeobjetosquetienelacoleccin.

http://www.conoce3000.com/html/espaniol/Libros/PascalConFreePascal/Cap1303CreandoManejandoColecciones.php

1/8

15/10/2015

Conoce300::PascalconFreePascal::Listasycolecciones::Creandoymanejandocolecciones
Antes de crear una coleccin se debe definir la clase padre que se usar en la coleccin y esta debe heredar los atributos de
TCollectionItem,cuandoaadimosobjetosalacoleccinsedebedespusaadirlosatributosdelobjetocreado,paraellosedebe
usarunsolapamientoconlaclasepadredelacoleccin.Ejemplo

{$codepageutf8}
{$modeobjfpc}
USESsysutils,classes;
TYPE
TInteger=CLASS(TCollectionItem)
PUBLIC
n:integer;
END;
TDouble=CLASS(TCollectionItem)
PUBLIC
n:double;
END;

VARColeccionN,ColeccionD:TCollection;
n:TInteger;
d:TDouble;
i:byte;
BEGIN
randomize;
ColeccionN:=TCollection.create(TInteger);
ColeccionD:=TCollection.create(TDouble);
FORi:=0TO10DO
BEGIN
n:=TInteger(ColeccionN.Add);
d:=TDouble(ColeccionD.Add);
n.n:=random(1000);
d.n:=random;
END;
Writeln('ColeccionN');
Writeln('Cantidad=',ColeccionN.Count);
FORi:=0TO10DOWriteln('[',i:2,']',TInteger(ColeccionN.items[i]).n);
Writeln('Borrando');
//Ponelalistaanilylacantidada0ytambin
//ejecutaelmtodofreedecadainstanciadelacoleccin
ColeccionN.free;
Writeln('ColeccionD');
Writeln('Cantidad=',ColeccionD.Count);
FORi:=0TO10DOWriteln('[',i:2,']',TDouble(ColeccionD.items[i]).n:0:3);
Writeln('Borrando');
//Ponelalistaanilylacantidada0y
//tambinejecutaelmtodofreedecadainstanciadelacoleccin
ColeccionD.free
END.

Cdigofuente9:Creandoymanejandocolecciones.

Enelejemploanteriorsecreandoscoleccionesunadenmerosenterosylaotrodenmerosreales,paraeliminarlascolecciones
lo recomendado es ejecutar el mtodo free de cada coleccin, y evitar el uso de destroy. Al borrar o destruir la coleccin no
necesitamoseliminarcadaobjetodelacoleccin,estosseeliminanporeldestructordelacoleccin.Esdecireldestructordeuna
coleccinseencargadedestruircadaunodelosobjetosdelacoleccin.Sinoqueremoseliminarlacoleccinyslosusobjetos
entoncessedebeusarelmtodoclear,estemtodosoloeliminalosobjetosdelacoleccin.
Cuandoaccedemosalosobjetosdelacoleccinsiempresedebeusarelsolapamientoconeltipodedatodelaclasepadredela
coleccin, para poder acceder a sus atributos. Si deseamos hacer una coleccin de cadena de caracteres del tipo ansistring o
unicodestring,debemoshacerunaclasequecontengaeltipodedatoansistringounicodestring,delmismomodocomoseusoen
elejemploanteriorparalosnmerosenterosyrealesdelejemploanterior.Elsiguienteejemploesunacoleccindeobjetosdela
clasepadreTPersona,quesevioenelcdigofuente3delcapituloanterior.Ejemplo:

{$codepageutf8}
{$modeobjfpc}
USESsysutils,classes;
TYPE
TPersona=CLASS(TCollectionItem)
PUBLIC
Nombre,Ciudad:string;
PROCEDUREMostrarPersona;
END;
PROCEDURETPersona.MostrarPersona;
BEGIN
Writeln('Nombre:',Nombre);
Writeln('Ciudad:',Ciudad)
END;

http://www.conoce3000.com/html/espaniol/Libros/PascalConFreePascal/Cap1303CreandoManejandoColecciones.php

2/8

15/10/2015

Conoce300::PascalconFreePascal::Listasycolecciones::Creandoymanejandocolecciones

VARLista:TCollection;
rpta:char;
i:byte;
Persona:TPersona;
BEGIN
Lista:=TCollection.create(TPersona);
REPEAT
Persona:=TPersona(Lista.Add);
Write('Nombre:');Readln(Persona.Nombre);
Write('Ciudad:');Readln(Persona.Ciudad);
Write('Deseacontinuar[S]i[N]o:');readln(rpta)
UNTIL(rpta='N')OR(rpta='n');
FORi:=0TOlista.Count1DOTPersona(Lista.items[i]).MostrarPersona;
Writeln('Cantidad=',Lista.Count);
Writeln('Borrando');
Lista.clear;
Lista.destroy
END.

Cdigofuente10:ColeccionconcadenasdecaracteresconTPersona.

Elsiguienteejemplomuestraelusodelosmtodosinsert,delete,yexchange,enlascoleccionesnoexisteunmtodomove,first
y last. Pero el mtodo move se puede implementar usando insert, delete y exchange, tomando en cuenta las siguientes
consideraciones:
Sielorigenesmayorqueeldestino,entoncesseinsertaunobjetoeneldestino,seintercambiaelorigen+1coneldestino,
yseborraelorigen+1
Sielorigenesmenorqueeldestino,entoncesseinsertaunobjetoeneldestino+1,seintercambiaelorigenconel
destino+1,yseborraelorigen.
Acontinuacinelejemplo:

{$codepageutf8}
{$modeobjfpc}
USESsysutils,classes;
TYPE
TCadenas=CLASS(TCollectionItem)
PUBLIC
Cad:ansistring;
CONSTRUCTORcrear(ccad:ansistring);
END;
CONSTRUCTORTCadenas.crear(ccad:ansistring);
BEGIN
cad:=ccad
END;
VARColeccion:TCollection;
i:byte;
micad:TCadenas;
BEGIN
Coleccion:=TCollection.create(TCadenas);
FORi:=0TO10DO
BEGIN
micad:=TCadenas(Coleccion.add);
micad.crear('Numero'+intTostr(i))
END;
FORi:=0TOColeccion.Count1DO
Writeln('[',i:2,']',TCadenas(Coleccion.items[i]).cad);
Writeln('========INSERTANDOEN5========');
micad:=TCadenas(Coleccion.Insert(5));
micad.Crear('Insertado');
Writeln('Cantidad=',Coleccion.Count);
FORi:=0TOColeccion.Count1DO
Writeln('[',i:2,']',TCadenas(Coleccion.items[i]).cad);

Writeln('========BORRANDO5========');
Coleccion.Delete(5);
Writeln('Cantidad=',Coleccion.Count);
FORi:=0TOColeccion.Count1DO
Writeln('[',i:2,']',TCadenas(Coleccion.items[i]).cad);
Writeln('========INTERCAMBIANDO1con4========');
Coleccion.Exchange(1,4);
FORi:=0TOColeccion.Count1DO
Writeln('[',i:2,']',TCadenas(Coleccion.items[i]).cad);

http://www.conoce3000.com/html/espaniol/Libros/PascalConFreePascal/Cap1303CreandoManejandoColecciones.php

3/8

15/10/2015

Conoce300::PascalconFreePascal::Listasycolecciones::Creandoymanejandocolecciones
Writeln('========MOVIENDO4a1========');
//origenmayorquedestino4>1=>origen+1ydestinoquedaigual
Coleccion.Insert(1);//insertaunobjetovacio
Coleccion.Exchange(5,1);
Coleccion.Delete(5);
FORi:=0TOColeccion.Count1DO
Writeln('[',i:2,']',TCadenas(Coleccion.items[i]).cad);
Writeln('========MOVIENDO2a4========');
//origenmenorquedestino2<4=>origenquedaigualydestino+1
Coleccion.Insert(5);//insertaunobjetovacio
Coleccion.Exchange(2,5);
Coleccion.Delete(2);
FORi:=0TOColeccion.Count1DO
Writeln('[',i:2,']',TCadenas(Coleccion.items[i]).cad);
Writeln('ElprimeroelementodelaColecciones:',
TCadenas(Coleccion.Items[0]).cad);
Writeln('ElultimoelementodelaColecciones:',
TCadenas(Coleccion.Items[Coleccion.Count1]).cad);
Coleccion.free
END.

Cdigofuente11:Usodeinsert,deleteyexchange.

En este ejemplo para aadir los objetos a la coleccin se hace uso de una clase padre que contiene un constructor, que nos
permitecolocaruncontenidoalacadenadecaracteresquetienecadaobjeto.
Cuandoinsertamosunobjetoalacoleccinenlaposicinindicada,loselementosapartirdelaposicinsedesplazantodosala
siguiente,ycomosepuedeobservaraleliminarunobjetodelacoleccinnoesnecesarioeliminarelobjetoindividualmentecomo
sucedecuandousamoslistas,deesoseencargaelmtodoDelete,queusamosparaeliminarelobjetodelacoleccin.
LosmtodosExtract,RemoveeIndexOfnotienensentidoqueexistanenunacoleccinyaqueloselementosdeunacoleccin
no son simples punteros, pero existen situaciones en las que necesitamos extraer un objeto de una coleccin para colocarlo en
otra,enesoscasosdebemossobrescribirelmtodoAssigndelaclaseTCollectionItems,parapoderasignarlosatributosdeun
objetodeunacoleccinenotroydespusborrarlaanterior.ElmtodoAssignquedaramsomenosas:

ProcedureTClasePadre.Assign(source:TPersistent)
Begin
ifSourceisTCadenas
thencad:=TCadenas(Source).cad
elseinheritedAssign(Source)
End

TClasePadreserefierealaclasequeseusarparacrearelobjeto,ydespuscuandodeseamostrasladardeunacoleccinaotro
podramoshacerlosiguiente:

coleccion02.add
coleccion02.items[coleccion02.Count1]:=coleccion01.items[5]
coleccion01.delete(5)

Elejemplocompletolopuedenveracontinuacin:

{$codepageutf8}
{$modeobjfpc}
USESsysutils,classes;

TYPE
TCadenas=CLASS(TCollectionItem)
PUBLIC
Cad:ansistring;
PROCEDUREAssign(source:TPersistent);override;
END;
PROCEDURETCadenas.Assign(source:TPersistent);
BEGIN
IFSourceisTCadenasTHEN
cad:=TCadenas(Source).cad
ELSE
inheritedAssign(Source);
END;

VARcoleccion01,coleccion02:TCollection;
aux:TCadenas;
i:byte;
BEGIN
Writeln('Coleccion01');
coleccion01:=TCollection.create(TCadenas);
FORi:=0TO5DO
BEGIN
aux:=TCadenas(coleccion01.Add);
aux.cad:='coleccion01'+intTostr(i)
END;

http://www.conoce3000.com/html/espaniol/Libros/PascalConFreePascal/Cap1303CreandoManejandoColecciones.php

4/8

15/10/2015

Conoce300::PascalconFreePascal::Listasycolecciones::Creandoymanejandocolecciones
aux:=TCadenas(coleccion01.items[5]);
//marcamoselobjetoquequeremosextraer
aux.cad:='*'+aux.cad+'*';
FORi:=0TOcoleccion01.Count1DO
Writeln('[',i:2,']',TCadenas(coleccion01.items[i]).cad);
Writeln('Coleccion02');
coleccion02:=TCollection.create(TCadenas);
FORi:=0TO5DO
BEGIN
aux:=TCadenas(coleccion02.Add);
aux.cad:='coleccion02'+intTostr(i)
END;
FORi:=0TOcoleccion02.Count1DO
Writeln('[',i:2,']',TCadenas(coleccion02.items[i]).cad);
coleccion02.add;
coleccion02.items[6]:=coleccion01.items[5];
coleccion01.delete(5);
Writeln('Coleccion01');
FORi:=0TOcoleccion01.Count1DO
Writeln('[',i:2,']',TCadenas(coleccion01.items[i]).cad);
Writeln('Coleccion02');
FORi:=0TOcoleccion02.Count1DO
Writeln('[',i:2,']',TCadenas(coleccion02.items[i]).cad)
END.

Cdigofuente12:UsodeAssign.

Las colecciones no tienen un mtodo Addlist que permite aadir los elementos de una lista en otra lista. Las colecciones por el
contrario tienen un mtodo Assign, no confundir con el Assign de TColleccionItem. Este mtodo permite crear objetos en una
coleccin y asignar los objetos de otra coleccin al mismo tiempo, usando el mtodo Assign propio de cada objeto de la otra
coleccin.
ParapoderhacerlosedebemodificarelmtodoAssigndeTCollectionItemcomolohicimosanteriormenteyluegousarelmtodo
Assign de la coleccin, pero este mtodo no permite unir dos colecciones en una, ya que si volvemos a usar el mismo mtodo
este borrara los anteriores objetos antes de asignar los nuevos. Para tal situacin si queremos asignar ms objetos debemos
hacerloconunbucleforquepermitaadicionarmsobjetos,usandoelmtodoAdd.Ejemplo:

{$codepageutf8}
{$modeobjfpc}
USESsysutils,classes;
TYPE
TCadenas=CLASS(TCollectionItem)
PUBLIC
Cad:ansistring;
CONSTRUCTORcrear(ccad:ansistring);
PROCEDUREAssign(Source:TPersistent);override;
END;
CONSTRUCTORTCadenas.crear(ccad:ansistring);
BEGIN
cad:=ccad
END;
PROCEDURETCadenas.Assign(Source:TPersistent);
BEGIN
IFSourceisTCadenasTHEN
cad:=TCadenas(Source).cad
ELSE
inheritedAssign(Source);
END;

VARcoleccion01,coleccion02,coleccion03:TCollection;
i:byte;
aux:TCadenas;
BEGIN
coleccion01:=TCollection.create(TCadenas);
FORi:=0TO10DO
BEGIN
aux:=TCadenas(coleccion01.add);
aux.crear('Numero'+intTostr(i));
END;
coleccion02:=TCollection.create(TCadenas);
FORi:=11TO20DO
BEGIN
aux:=TCadenas(coleccion02.add);
aux.crear('Numero'+intTostr(i));
END;
coleccion03:=TCollection.create(TCadenas);
coleccion03.Assign(coleccion01);
//Sacaunacopiadetodoslosobjetosdecoleccion01y
//loscolocaencoleccion03,elrestosehacemanualmente

http://www.conoce3000.com/html/espaniol/Libros/PascalConFreePascal/Cap1303CreandoManejandoColecciones.php

5/8

15/10/2015

Conoce300::PascalconFreePascal::Listasycolecciones::Creandoymanejandocolecciones
FORi:=0TOcoleccion02.Count1DO
BEGIN
aux:=TCadenas(coleccion03.add);
aux.Assign(coleccion02.items[i])
END;
coleccion01.clear;
coleccion02.clear;
FORi:=0TOcoleccion03.Count1DOWriteln(TCadenas(coleccion03.items[i]).cad);
END.

Cdigofuente13:UsodeAssigndeTCollection.

Enelejemplosepuedeobservarelusodelbuclefor,enelcualsehaceunrecorridoportodoslosobjetosdelacoleccin02,para
iraadindolosalacoleccion03.
Hay situaciones en las que necesitamos extraer un objeto de la coleccin y que este ya no este en ella, para ello debemos de
crearunobjetodelaclasepadrequelocontenga,paraborrarloposteriormentedelacoleccin.Elmtodocreatedelaclasepadre
es un constructor sobrescrito de TCollectionItem, que usa un parmetro de tipo TCollection, que se usa para indicarle en que
coleccin se debe aadir el objeto. El constructor se puede usar tambin para aadir objetos a una coleccin, pero si queremos
crear un objeto de la clase padre, sin aadirlo a una coleccin debemos colocar nil como parmetro del mtodo create, para
indicarlequeesteobjetonoperteneceaningunacoleccin.Acontinuacinelejemplo.

{$codepageutf8}
{$modeobjfpc}
USESsysutils,classes;
TYPE
TCadenas=CLASS(TCollectionItem)
PUBLIC
Cad:ansistring;
PROCEDUREAssign(source:TPersistent);override;
END;
PROCEDURETCadenas.Assign(source:TPersistent);
BEGIN
IFSourceisTCadenasTHEN
cad:=TCadenas(Source).cad
ELSE
inheritedAssign(Source);
END;

VARcoleccion01:TCollection;
aux:TCadenas;
i:byte;
BEGIN
Writeln('Coleccion01');
coleccion01:=TCollection.create(TCadenas);
FORi:=0TO5DO
BEGIN
aux:=TCadenas.create(coleccion01);
aux.cad:='coleccion01'+intTostr(i)
END;
aux:=TCadenas(coleccion01.items[5]);
//marcamoselobjetoquequeremosextraer
aux.cad:='*'+aux.cad+'*';
FORi:=0TOcoleccion01.Count1DOWriteln('[',i:2,']',TCadenas(coleccion01.items[i]).cad);
aux:=TCadenas.create(NIL);
aux.Assign(coleccion01.items[5]);
coleccion01.delete(5);
Writeln('Coleccion01');
FORi:=0TOcoleccion01.Count1DOWriteln('[',i:2,']',TCadenas(coleccion01.items[i]).cad);
Writeln('aux=',aux.cad);
coleccion01.free
END.

Cdigofuente14:Extraerunobjetodeunacoleccin.

En el ejemplo anterior se puede observar que para aadir nuevos objetos a la coleccin, se hace uso del constructor en ves de
usarelmtodoAdd.
Aligualquelaslistastambinsepuedenusarlosbuclesforinloop,paraellosenecesitadeunavariabledecontrolqueseaun
objetodelaclasequeseusaenlacoleccin.Esdecirelsiguientebucle:

fori:=0to10doWriteln('[',i:2,']',Tinteger(ColeccionN.items[i]).n)

endondeTintegereslaclasedetodoslosobjetosdeColeccionN,sepuedeescribirdelsiguientemodousandoforinloop:

http://www.conoce3000.com/html/espaniol/Libros/PascalConFreePascal/Cap1303CreandoManejandoColecciones.php

6/8

15/10/2015

Conoce300::PascalconFreePascal::Listasycolecciones::Creandoymanejandocolecciones
forTCollectionItem(n)inColeccionNdoWriteln('[',n.index:2,']',n.n)

En donde n es un objeto de la clase Tinteger al que se le hace un solapamiento con TCollectionItem, ya que el bucle forinloop
esperaquelavariabledecontrolseaunTCollectionItemcuandoestetrabajaconColecciones.Aqutambinsepuedeobservarel
usodelatributoindex,esteatributoesunaherenciadeTCollectionItem,ycontieneelindicequelecorrespondeenlacoleccinal
objeto.Elsiguientecdigofuenteeselmismoejemplo01peroestehaceusodeforinloop.

{$codepageutf8}
{$modeobjfpc}
USESsysutils,classes;
TYPE
TInteger=CLASS(TCollectionItem)
PUBLIC
n:integer;
END;
TDouble=CLASS(TCollectionItem)
PUBLIC
n:double;
END;

VARColeccionN,ColeccionD:TCollection;
n:TInteger;
d:TDouble;
i:byte;
BEGIN
randomize;
ColeccionN:=TCollection.create(TInteger);
ColeccionD:=TCollection.create(TDouble);
FORi:=0TO10DO
BEGIN
n:=TInteger(ColeccionN.Add);
d:=TDouble(ColeccionD.Add);
n.n:=random(1000);
d.n:=random;
END;
Writeln('ColeccionN');
Writeln('Cantidad=',ColeccionN.Count);
FORTCollectionItem(n)INColeccionNDOWriteln('[',n.index:2,']',n.n);
Writeln('Borrando');
ColeccionN.free;
Writeln('ColeccionD');
Writeln('Cantidad=',ColeccionD.Count);
FORTCollectionItem(d)INColeccionDDOWriteln('[',d.index:2,']',d.n:0:3);
Writeln('Borrando');
ColeccionD.free
END.

Cdigofuente15:Usodeforinloopconcolecciones.

Recomendar

Twittear

anterior::indice::siguiente

SUGERENCIAS

http://www.conoce3000.com/html/espaniol/Libros/PascalConFreePascal/Cap1303CreandoManejandoColecciones.php

7/8

15/10/2015

Conoce300::PascalconFreePascal::Listasycolecciones::Creandoymanejandocolecciones
"Agradezco que se tomen su tiempo, para escribirme una sugerencia. Toda sugerencia que me
escribameayudaamejorarloscontenidosdelawebacordeasusnecesidades.Lassugerencias,se
recibirn siempre y cuando ingrese al menos su nombre o seudnimo y la sugerencia. Las
sugerenciassondeusointernoynosernpublicadasenlawebConoce3000"

Nombreoseudnimo

CorreoElectrnico

Sugerencias

Deseorecibirunacopiadelmensaje.

Enviar

PORTADA| LIBROS| APUNTES| ARTCULOS

Todoslostextos,imgenesyvideosdeConoce3000estancolocadosbajounalicencia:
CreativeCommonsReconocimientoNoComercial3.0UnportedLicense.

http://www.conoce3000.com/html/espaniol/Libros/PascalConFreePascal/Cap1303CreandoManejandoColecciones.php

8/8

Potrebbero piacerti anche