You are on page 1of 30

Programación II

Las Colecciones y sus


aplicaciones

MSc. José Ben-Hur Saravia M.


Objetivos
● Conocer las principales estructuras de datos
con las que se puede trabajar en Smalltalk.
● Comprender las diferencias entre los tipos de
colecciones que existen en Smalltalk.
● Identificar los diferentes métodos para trabajar
con colecciones.
● Desarrollar aplicaciones que involucren
colecciones.
Introducción
Que es una Coleccion ?
● La real academia define una colección como un conjunto
ordenado de cosas, por lo común de una misma clase y
reunidas por su especial interés o valor. Colección de plantas,
de medallas, de mapas, de libros, etc.
● Las colecciones nos resultan de utilidad porque nos permiten
agrupar objetos, para luego poder operar sobre un elemento en
particular, sobre algunos elementos seleccionados mediante un
filtro, o sobre una colección como conjunto.
● Una colección es un objeto que se usa para almacenar otros
objetos. Como todo en Smalltalk es un objeto, podemos
deducir que una colección también es un objeto.
Introducción
Que es una Colección ?
● A primera vista una colección es un conjunto de objetos, pero si lo
vemos detenidamente nos damos cuenta que es más preciso pensarla
como un conjunto de referencias: los elementos no están adentro de la
colección, sino que la colección los conoce.
● Una colección es simplemente un conjunto de elementos donde cada
elemento es un puntero a un objeto.
● Smalltalk posee un número de diferentes tipos de colecciones
incluyendo: Bag (Bolsa), Set (Conjunto), Array (Vector),
OrderedCollection (Colección Organizada), SortedCollection
(Colección Ordenada), String (Cadena), Symbol (Símbolo), Dictionary
(Diccionario) entre otros.
● La mayoria de las colecciones se encuentran en la jerarquia de la
clase Collection.
Colecciones
● Las colecciones de Smalltalk son de diversos
tipos y se pueden usar según la necesidad del
caso:
● ¿Elementos ordenados?
● ¿Se admiten duplicados?
● Etc.

● Se debe tener en cuenta que las colecciones


son heterogéneas, siempre se admiten
elementos de tipos diversos.
Colecciones
Jerarquía de la clase Collection
Bolsas (Bag)
● Una Bag es una colección desorganizada de elementos que está preparada
para una búsqueda eficiente, actúa como un contenedor dentro del cual se
pueden colocar y retirar cosas.
● Guardan sus elementos al azar y no pueden ser indexadas. Una Bolsa puede
incrementar o decrementar su tamaño, y acepta elementos duplicados (puede
contener el mismo objeto varias veces).
● Una Bolsa es una buena colección a usar si se necesita una colección que
pueda cambiar de tamaño, que el orden de los objetos dentro de la colección
no sea importante, y que no importe si hay objetos duplicados o no.
● Por ejemplo, una bolsa es una buena elección para manejar una lista de
objetos cliente. No importa en qué orden estos objetos sean colocados en la
lista, no es importante indexar esta lista, y la lista necesita crecer y disminuir.
Bolsas
● Principales metodos
– new. Crea un nuevo objeto de clase bag.
● x:= bag new. ' crea una nueva instancia de la clase Bag denominada x'
– bag with: with: ... Crea una nueva instancia de clase bag con elementos determinados
● z:= Bag with:1 with:$a. 'Crea una nueva instancia denominada z, que contienen los elementos 1 y a'
– add: agrega un objeto a la bolsa.
● z add:3. 'Agrega el objeto tres a la bolsa z'
– Add: withOccurrences: Agrega un objeto (add:) un numero de veces (withOccurrences).
● z add:5 withOccurrences:4 'agrega cuatro veces el objeto 5 en la bolsa denominada z'
– remove: Elimina un objeto de determinado de la bolsa.
● z remove: 1. 'Remueve el objeto 1 de la bolsa z'
– remove: ifAbsent: Elimina algún objeto de la bolsa y si este no existiera ejecuta una
acción.
● t remove:3 ifAbsent: ['el objeto no existe' ].'
Bolsas
● Principales metodos
– includes: unObjeto. Verifica la existencia de un objeto en bolsa y si existiera devuele
true, de lo contrario devuelve false.
● z includes: 3
– OccurrencesOf: verifica el número de veces que se encuentra un objeto en una
colección.
● z occurrencesOf:5 'deuleve el nnúmero de veces que se encuentra el objeto 5 en la bolsa z'.
– isEmpty. Verifica si la bolsa esta vacía.
● Z isEmty 'devuelve false porque la bolsa no esta vacía'
– size. Retorna el número de elementos que se encuentran en un bolsa.
● z size. 'devuelve el número 6, que corresponde a la cantidad de elementos que se encuentran en la
bolsa.
copy. Se realiza una copia de una bolsa.
● s:= z copy. 'realiza una copia de z y la asigna al objeto s'
– do realiza una serie de iteraciones soble los objeto de una bolsa.
● z do: [ :objt | Transcript show:objt; cr] . 'Imprime en el Transcript todos los objetos que contiene la
bolsa z'
Conjuntos (Set)
● El Set, como su nombre lo indica, está concebido para
la representación de conjuntos. Su principal
característica consiste en que los elementos que
pertenecen al conjunto son únicos en él. En resumidas
palabras, en los conjuntos (Sets) no se tiene dos veces
el mismo elemento. Salvo por esta propiedad, el
comportamiento es el mismo que el del Bag.
● Un Conjunto ignora cualquier petición que pudiera
agregar un elemento duplicado a la colección.
Conjuntos (Set)
● Principales métodos
– Todos lo métodos de la colección Bag, son parte del protocolo de la
clase Set.
– atRandom. Retorna un elemento del conjunto, de forma aleatoria.
– like:unObjeto retorna un objeto dentro de la colección que es igual
al parámetro que se envía. Si no existiera tevuelve nil
● z like:3.

– copyWithout:unObjeto. Retorna un colección que no incluye el


elemento determinado por unObjeto
● f:= y copyWithout:10. 'retorna la colección de todos lo elementos

almacenados en y menos el objeto 10 y se asigna al objeto f'.


Arreglos (Array)
● Un Array es una colección, de tamaño fijo, de elementos que pueden
ser indexados por claves de números enteros que comienzan en 1.
● Un Array no puede crecer o disminuir. Los elementos de un Vector
puede ser cualquier objeto, los objetos duplicados están permitidos, y
los elementos se guardan en un orden al azar.
● Un Array es útil cuando se conoce el tamaño de la colección y ese
tamaño cambia raramente.
– Por ejemplo, asumamos que se está diseñando una aplicación
para administrar habitaciones en un edificio. El número de
habitaciones es fijo y se desea una manera rápida de indexar
cada habitación para chequearlas en su momento oportuno
Arreglos
● Un Array es un ejemplo de una clase implementada
usando variables de instancia indexadas.
● Se debe recordar que el número de variables de instancia
indexadas se establece en el instante de la creación.
● Un Array no puede crecer en el número de variables de
instancia indexadas sin crear una nueva instancia.
● Si intentamos acceder a un elemento que no este dentro
de los limites del array este se quejara con un error
Arreglos
● Métodos más importantes
– Los métodos revisados anteriormente para las clases Bag y Set también son
aplicables a la clase Array.
– new: unEntero, este método retorna un arreglo de tamaño determinado por el
valor correspondiente a unEntero.
– at:unNumero Este método retorna el objeto almacenado en la posición
correspondiente al número indicado por unNumero
– at:unNumero put:unObjeto. Almacena un objeto determinado por unObjeto en
la posición indicada por unNumero.
|unArray|
unArray := Array new: 5.
unArray at: 1 put: 1;
at:2 put: 2;
at: 3 put: 'unArray';
at: 4 put: #pepe;
at: 5 put: $&.
^unArray .
OrderedCollection (Colección
Organizada)
● Una OrderedCollection ofrece el protocolo más completo de cualquiera de las clases de
colecciones, y es consecuentemente el "caballo de batalla" más utilizado por los programadores.
Una Colección Organizada puede ser indexada por una clave de números enteros que comienzan
en 1.
● Los elementos de una Colección Organizada pueden ser objetos de cualquier clase.
● Una Colección Organizada también permite objetos duplicados y guarda los elementos en un
orden al azar.
● Este tipo de colección es principalmente utilizada para listas de tamaño variable que requieren de
un control sobre la ubicación de los elementos de la colección.
● Una Colección Organizada no contiene variables de instancia indexadas. Administra sus listas de
objetos creando una colección que es indexable.
● Un objeto de la clase OrderedCollection apunta a esta colección desde una de sus variables de
instancia. De esta forma administra sus elementos como variables de instancia con un nivel de
indirección. Esta es la razón por la cual una Colección Organizada puede crecer o disminuir.
OrderedCollection
● Métodos importantes para la clase colección.
● Todos lo métodos estudiados anteriormente son aplicables este tipo de colección.
● add:unObjeto after:unEntero. Agrega unObjeto al orderedCollection en la posición
siguiente al valor determinado por unEntero.
● add:unObjeto before:unEntero. Agrega unObjeto al orderedCollection en la posición
anterior al valor determinado por unEntero.
● UnaColección addFirst:unObjeto. Agrega un objeto determinado por unObjeto al
inicio de la colección determinada por unaColección.
● UnaColección addlast:unObjeto. Agrega un objeto determinado por unObjeto al
final de la colección determinada por unaColección.
● UnaColección AddAllFirst:coleccion2. Agrega una colección determinada por
coleccion2 al inicio de la colección determinada por unaColección.
● UnaColección AddAllLast:coleccion2. Agrega una colección determinada por
coleccion2 al final de la colección determinada por unaColección.
● UnaColección copyFrom:UnEntero to:unEntero. Copia los elementos de una
colección determinados por la posición unEntero descrita en la sección copyFrom,
hasta el elemento de la colección determinado por unEntero descrito en la posición to:.
OrderedCollection
● Ejemplo:
autos := OrderedCollection new.
autos add: 'Fiat'.
autos addFirst: 'Peugeot'.
autos addLast: 'Ford'.
^autos

Salida: OrderedCollection('Peugeot' 'Fiat' 'Ford')


LinkedList (Listas enlazadas)
● Una lista enlazada representa a una colección
de enlaces, que son contenedores de otros
objetos.
● El uso de métodos como el addFirst y el
removeLast hacen que tenga el
comportamiento de una pila.
● El uso de métodos como el addlast y el
removeFirst hacen que tenga el
comportamiento de una cola.
Listas enlazadas
● Métodos Importantes
– Todos los métodos estudiados anteriormente son
aplicables a esta colección
– unaColeccion first. Retorna el primer elemento de la
LinkedList, si la lista estuviera vacía notifica un error.
– unaColeccion last. Retorna el último elemento de la
LinkeLlist, si la lista estuviera vacía notifica un error.
– unaColeccion removeFirst. elimina el primer elemento de
la LinkedList, si la lista estuviera vacía notifica un error.
– unaColeccion removeLast. Remueve el último elemento
de la LinkeLlist, si la lista estuviera vacía notifica un error.
Diccionarios (Dictionary)
● Un objeto dictionary es como una base de datos simple. Los diccionarios son
colecciones desorganizadas cuyos elementos son accesados por una clave
externa explícitamente asignada.
● Las claves usualmente son cadenas o símbolos, pero en principio cualquier objeto
puede ser usado como una clave de diccionario.
● Los diccionarios mantienen un seguimiento de las parejas clave/valor. Cada par
clave/valor es una instancia de una clase llamada Association.
● Una instancia de asociación apunta a un objeto que es una clave y apunta a un
objeto que es el valor. Un elemento en un diccionario contiene un puntero a una
instancia de asociación. No hay restricciones sobre los elementos que se guardan
en un diccionario.
● Las claves deben ser únicas en un diccionario, por lo que no habrá dos
asociaciones en un diccionario que tengan claves con el mismo valor.
Diccionarios (Dictionary)
● El apareo de claves para el almacenamiento o acceso de los elementos está
basado en la operación de igualdad =. Consecuentemente, las claves deben ser
únicas con respecto a la operación de igualdad, que es, dos elementos no pueden
estar asociados a la misma clave ni dos claves pueden ser iguales. Por ejemplo, si
un objeto String con el valor 'nombre' está actualmente almacenado como clave,
otro objeto String con el mismo valor no puede ser agregado como clave.
● Debido a los pares clave/valor, varios de los métodos para la clase Dictionary son
un poco diferentes de los métodos para las otras colecciones.
● La clase Dictionary también ofrece varios métodos adicionales específicos para
claves y valores.
Diccionarios (Dictionary)
● add: agrega el argumento unaAsociacion al diccionario. Devuelve la asociación que
fue agregada.
● Ejemplo
– Dictionary new add: (Association key: '45841122');
● removeKey: unaClave. El mensaje removeKey:elimina una asociación del
diccionario con la clave igual al argumento unaClave. El mensaje devuelve el valor
de la asociación que fue eliminada. Si el argumento unaClave no es encontrado en
el diccionario se visualizará la ventana de depuración. Inspeccione el siguiente
ejemplo

|unDiccionario|
unDiccionario := Dictionary new.
unDiccionario add: (Association key: '45841122' value: 'Rodriguez, Manuel').
unDiccionario removeKey: '45841122'

Diccionarios (Dictionary)
● at: unaClave. El mensaje at: devuelve el valor asociado con el argumento
unaClave. Si unaClave no existe en el diccionario se visualizará la ventana
de depuración. ejemplo:
|unDiccionario|
unDiccionario := Dictionary new.
unDiccionario add: (Association key:'45841122' value:'Rodriguez, Manuel').
unDiccionario at:'45841122'
● keyAtValue: unValor. El mensaje keyAtValue: devuelve la clave del primer
valor que encuentra que es igual al argumento unValor. Si el argumento
unValor no se encuentra en el diccionario, se visualizará la ventana de
depuración. ejemplo:
|unDiccionario|
unDiccionario := Dictionary new.
unDiccionario add: (Association key:'45841122' value:'Manuel').
unDiccionario keyAtValue:'Manuel'
Diccionarios (Dictionary)
● at:unaClave put:unValor. El mensaje at: put: encuentra el argumento
unaClave en el diccionario y reemplaza su valor por el argumento unValor. Si la
clave no se encuentra, entonces se agrega al diccionario. Este mensaje puede
ser utilizado en lugar del mensaje add: para agregar una nueva asociación al
diccionario. Este mensaje devuelve unValor. Pruebe el siguiente ejemplo:
|unDiccionario|
unDiccionario := Dictionary new.
unDiccionario add: (Association key:'45841122' value:'Manuel').
unDiccionario at:'45841122' put:'Felipe'.
unDiccionario at:'45820022' put:'Tía Claudia'.
UnDiccionario
● Note que el valor para la clave '45841122' ha sido modificado y una nueva
asociación con la clave '45820022' y el valor 'Tía Claudia' ha sido agregado.

Diccionarios (Dictionary)
● do: unBloque. El mensaje do: realiza iteraciones a través de todos los
elementos del diccionario, ejecutando un bloque de código de un sólo
argumento especificado por el argumento unBloque, el argumento de dicho
bloque se corresponde con los valores de cada asociación. Ejemplo:
|unDiccionario unaColeccion|
unDiccionario := Dictionary new.
unaColeccion := OrderedCollection new.
unDiccionario at:'45841122' put:'Manuel'.
unDiccionario at:'45820022' put:'Tía Claudia'.
unDiccionario do:[:nombre |unaColeccion add:'Nombre = ',nombre].
^unaColeccion
● Este ejemplo devuelve una Colección Organizada donde cada elemento apunta
a un objeto String con el nombre de la persona precedido por la cadena
'Nombre = '.
Diccionarios (Dictionary)
● keysDo: unBloque. El mensaje keysDo: realiza iteraciones a través de todos
los elementos del diccionario, ejecutando un bloque de código de un sólo
argumento especificado por el argumento unBloque, donde cada agumento de
dicho bloque se corresponde con la clave de cada asociación. Ejemplo:
|unDiccionario unaColeccion|
unDiccionario := Dictionary new.
unaColeccion := OrderedCollection new.
unDiccionario at:'45841122' put:'Manuel'.
unDiccionario at:'45820022' put:'Tía Claudia'.
unDiccionario keysDo:[:tel |unaColeccion add:'Teléfono = ',tel].
^unaColeccion
● Este ejemplo crea una Colección Ordenada con cada elemento apuntando a un
objeto String con el teléfono precedido por la cadena 'Teléfono = '.

Diccionarios (Dictionary)
● Keys. El mensaje keys devuelve un conjunto con todas las claves del diccionario. Ejemplo:
|unDiccionario|
unDiccionario := Dictionary new.
unaColeccion := OrderedCollection new.
unDiccionario at:'45841122' put:'Manuel'.
unDiccionario at:'45820022' put:'Tía Claudia'.
unDiccionario keys
● Values. El mensaje values devuelve una instancia de la clase Bag con todos los valores del
diccionario. Ejemplo:
|unDiccionario|
unDiccionario := Dictionary new.
unaColeccion := OrderedCollection new.
unDiccionario at:'45841122' put:'Manuel'.
unDiccionario at:'45820022' put:'Tía Claudia'.
unDiccionario values
● Nota: ¿Por qué el diccionario devuelve las claves en un Conjunto y los valores en una Bolsa?
Un Conjunto no permite dupclicados, mientras que una Bolsa sí lo hace. Un objeto Dictionary no
puede tener claves duplicadas, entonces un Conjunto es una buena elección. Pero como un
objeto Dictionary puede tener valores duplicados, se colocan en una Bolsa.
Resumen
● Las Colecciones manejan un grupo de objetos.
● Una Bag (Bolsa) es una colección de tamaño variable, que guarda objetos
en un orden al azar y que no es indexable.
● Un Set (Conjunto) es idéntica a una Bolsa excepto en que no permite
objetos duplicados.
● Un Array (Vector o Arreglo) es una colección de tamaño fijo que es
indexable.
● Una OrderedCollection (Colección Organizada) es una colección de
tamaño variable que es indexable.
● Una SortedCollection (Colección Ordenada) es una colección de tamaño
variable que guarda objetos en un orden específico por medio de un
bloque de ordenamiento de dos argumentos.
● Una LinkedList, es una colección que almacena enlaces a objetos.
Resumen
● Las Colecciones tienen varios mensajes que soportan la
administración de una colección. Esto incluye crear nuevas (new)
colecciones, preguntar por el tamaño (size) de una colección,
agregar (add) objetos a una colección, eliminar (remove) ítems de
una colección, e iterar (do) a través de una colección.
● Un String (cadena) es similar a un arreglo excepto en que sólo
contiene caracteres.
● Un Symbol (Símbolo) es similar a una cadena excepto en que no
permite objetos Symbol duplicados con el mismo valor.
● Un diccionario administra pares clave/valor. Un diccionario tiene
varios mensajes que soportan la administración de un diccionario.

You might also like