2. Índice
● Introducción
● Jerarquía de colecciones.
● Iterable - Iterator
● Colecciones
● Tipo de colecciones
● Secuencias
○ Listas
○ Arrays
○ List Buffeer
○ Ejemplos de código
○ Queue
○ Stacks
3. Índice
● Set & Maps
○ Operaciones Set
○ Operaciones Map
● Bibliografía
4. Introducción
Tendremos una visión general sobre de cómo
las estructuras de datos se relacionan entre sí
la jerarquía de colecciones (herencia).
El uso de las colecciones o estructuras se basa
en la forma en que deseemos almacenar los
datos para su posterior uso, conocer sus
ventajas, desventajas, aplicación y requisitos
de entrada.
5. Jerarquía de Colecciones
Lo que denotamos es que todas las colecciones derivan de la super trait Iterable de
las colecciones mutables e inmutables (Seq), los set y los maps, la mayoría de las
colecciones que se ofrecen son inmutables pero como derivan de Iterable, poseen
facilidad de iteración, dependiendo del uso o aplicación obtendremos un
rendimiento en las plataformas actuales de desarrollo.
6. Iterable - Iterator
Un iterador tiene muchos de los mismos métodos que iterable incluídas las de orden
superior pero no pertenecen a la misma jerarquía, pero se diferencian en que
Iterable puede manejar datos que se repitan más de una vez y así mismo se puede
usar los métodos Iterable múltiples ocasiones mientras que Iterator solo una.
7. Colecciones
● Seq: Es un iterable donde el orden de los elementos está arreglado con
posiciones de los índices empezando por 0.
○ Indexed Seq
○ Linear Seq
● Set: Son iterables que no contienen elementos duplicados.
○ Sorted Set
○ Bit Set
● Map: Es un iterable en el que cada elemento es un par (clave, valor)
○ SortedMap
8. Tipos de Colecciones
Básicamente existen dos tipos de colecciones: mutables e
inmutables, una colección mutables es factible ingresar, eliminar y
modificar elementos de una colección mientras que las inmutables
no se pueden cambiar los valores por asignación, existen método o
funciones que simulan las operaciones anteriormente mencionadas
pero éstas retornan una nueva colección dejando intacta la antigua.
9. Secuencias - Listas
Listas: Es el tipo más importante a saber dentro de las colecciones, es una estructura
de datos inmutable, Como ventaja podemos indica las listas tienen una estructura
recursiva, mientras que los arrays son planos.
La inmutabilidad de las listas permiten desarrollar algoritmos correctos y eficientes
porque se va a necesitar hacer copias de una lista.
Operaciones básica:
● head: devuelve el primer elemento de la lista.
● tail: devuelve una lista que consta de todos los elementos menos el primero.
● isEmpty: devuelve True si la lista está vacía
10. Secuencias - Arrays
Éstos permiten que se mantenga una secuencia de elementos y se pueda acceder a
una posición arbitraria, tanto como para obtener un elemento con un índice de base
cero, algo que denota es que éste tipo de colección es mutable.
Los array en Scala están representados en la misma forma que los array en Java, de
esa manera permite utilizar los mismo algoritmos desarrollados en Java y que
devuelvan un array, ésto quiere decir que posee los mismo métodos.
11. Secuencias - List Buffers
Un List Buffer es un objeto mutable que ayuda a construir listas de
manera más eficiente cuando se necesitan anexarlas, así mismo
proporcionan operaciones de agregación y anteponer operaciones, así
mismo al terminar de construir se puede invocarla mediante toList en el
ListBuffer.
Así una ventaja sería que al usar éste tipo de colección es evitar el
potencial del desbordamiento del stack de memoria, porque se puede
crear una la lista anteponiendo el orden deseado
12. Secuencias - ArrayBuffers
Un ArrayBuffer es como un array con la excepción añadir y eliminar elementos de al
inicio y al final de la secuencia, una desventaja sería que aunque posee todas las
operaciones de los arrays, aunque son un poco más lento debido a una capa de
envase (wrapping) en la ejecución.
Una ventaja es que cuando se crea el ArrayBuffer se debe especificar un parámetro
de tipo, pero no especificar su longitud, ésta colección automáticamente ajustará el
espacio asignado según sea necesario.
13. Ejemplos de Código
● Listas literales
val fruit = List("apples", "oranges", "pears")
val nums = List(1, 2, 3, 4)
val diag3 =
List(
List(1, 0, 0),
List(0, 1, 0),
List(0, 0, 1)
)
val empty = List()
14. Ejemplo de códigos
● Array
val fiveInts = new Array[Int] (5)
val fiveToOne = Array(5, 4, 3, 2, 1)
fiveInts(0) = fiveToOne( 4)
fiveInts
En la primera línea tenemos que crear el array de tipo entero con una longitud de 5, o sencillamente se lo carga con los valores vistos en la
segundalínea, los arrays son accesibles desde su índice, en la tercera línea se da el valor del fiveInts con la posición 0 el valor del array
fiveToOne con la posición 4, y luego se imprime el valor del array modificado.
15. Ejemplo de código
● List Buffer
import scala.collection.mutable.ListBuffer
val buf = new ListBuffer[Int]
buf += 1
buf += 2
buf
3 +: buf
buf.toList
Se importa la biblioteca mutable.ListBuffer y se instancia la estructura de datos, se agrega valores mediante buf += 1. buf +=2, como
mencionamos anteriormente, es factible ingresar valores al principio de la list buffer y se realiza en la penúltima línea anteponiendo el
valor al símbolo así 3 +: buf y se invoca la lista con el método toList
16. Ejemplo de código
● ArrayBuffer
import scala.collection.mutable.ArrayBuffer
val buf = new ArrayBuffer[Int] ()
buf += 12
buf += 15
buf
La primera línea importa la biblioteca mutable ArrayBuffer, luego se instancia sin declarar su longitud, se agregan valores al ListBuffer y al
final con el nombre de ésta se instancia la lista con todos sus valores.
17. Secuenciales - Queues
Es el tipo de colección de datos FIFO y en Scala ofrecen variantes mutables e
inmutables de cola. Se pueden agregar valores a una cola inmutable con enqueue, de
igual manera se puede agregar múltiples valores en la misma línea, para removar se
usa dequeue, pero al momento de usar éste método en una cola inmutable, éste
devuelve el elemento a la cabeza de la cola y una tupla que el resto de elementos
eliminados.
En la cola mutable se puede usar de forma similar, solo que en vez de usar enqueue,
usamos += y ++= para agregar valores y para descolar dequeue solo remueve el
elemento a la cabeza de ésta.
18. Secuenciales - Stacks
De igual manera que en las Colas, en las pilas existen versiones mutables e
inmutables, posee los métodos principales push y pop.
import scala.collection.mutable.Stack
val stack = new Stack[Int]
stack.push( 1)
stack.push( 2)
stack.top
stack.pop
stack
El comando push permite ingresar valores a la cola, top devuelve el valor tope de la cola y pop eliminar ese valor.
19. Set & Maps
Scala proporciona tanto mutables como inmutables versiones de Set y Maps y su
jerarquía es la siguiente:
20. Set & Maps
Por defecto se escribe “Set” o “Map” y se obtiene un objeto inmutable, si se desea
que sea inmutable se tiene que hacer una importación explícita.
Scala proporciona el acceso mediante el objeto Predef.
object Predef {
type Set[T] = scala.collection.immutable.Set[T]
type Map[K, V] = scala.collection.immutable.Map[K, V]
val Set = scala.collection.immutable.Set
val Map = scala.collection.immutable.Map
// ...
}
En el código anterior se explica el cómo instanciar un Set o un Map mutable o inmutable con las respectivas bibliotecas.
21. Operaciones - Set
La característica clave de los conjuntos es que se garantiza como máximo un valor por cada objeto
22. Operaciones - Map
Tenga en cuenta que parra poder crear un map, se debe especificar dos cosas, el primer es la clave del map y el segundo son los valores,
osea Map[String, int], , así mismo la lectura de un map es similar a la de una matriz.