Jeraquia de las colecciones¶
- Iterable: Superclase que agrupa todas las colecciones (recorrer)
- Seq: (Indexadas) hay orden, primer elemento, segundo elemento, n-esimo elemento: List, Stream, Vector, Range, Array, String
- Set: HashSet, TreeSet (Conjuntos)
- Map: Hashmap, Treemap
Secuenciales (Seq)¶
Array¶
Un arreglo es un colecciones de elementos del mismo tipo, pero que en memoria es una reserva espacio (lineal), por lo tanto su acceso es en tiempo constante \(O(1)\)

Los arreglos son más adecuados para operaciones de acceso.
scala> val arr = Array(1,2,3,4)
val arr: Array[Int] = Array(1, 2, 3, 4)
scala> arr(0)
val res0: Int = 1
scala> arr.length
val res1: Int = 4
scala> 1 +: arr
val res2: Array[Int] = Array(1, 1, 2, 3, 4)
Vector¶
Vector es una coleccion de datos del mismo inmutable, trabaja de forma similar a los Arrays, pero estan pensando en que pueden cambiar de tamaño.
scala> val vec = Vector(1,2,3,4)
val vec: scala.collection.immutable.Vector[Int] = Vector(1, 2, 3, 4)
scala> vec(0)
val res3: Int = 1
scala> vec.length
val res4: Int = 4
scala> 2 +: vec
val res7: scala.collection.immutable.Vector[Int] = Vector(2, 1, 2, 3, 4)
scala> vec :+ 2
val res8: scala.collection.immutable.Vector[Int] = Vector(1, 2, 3, 4, 2)
Diferencias¶
Array¶
- Es una colección indexada que pertenece a la categoría Seq
- En memoria es una reserva de espacio lineal
- Acceso en tiempo constante \(O(1)\) - muy eficiente para acceso por índice
- Más adecuado para operaciones de acceso frecuente
Vector¶
- También es una colección indexada dentro de Seq
- Estructura de datos inmutable por defecto en Scala
- Implementado como un árbol trie de 32 elementos (32-way trie)
- Acceso casi constante \(O(log_32(n))\) - muy eficiente para tamaños grandes
- Excelente para operaciones de actualización (prepend, append)
Diferencias clave:¶
| Característica | Array | Vector |
|---|---|---|
| Mutabilidad | Mutable | Inmutable |
| Acceso | \(O(1)\) | \(O(log_32(n))\) |
| Actualizaciones | Menos eficiente | Muy eficiente |
| Uso ideal | Acceso frecuente | Operaciones funcionales |
| Memoria | Reserva lineal | Estructura de árbol |
Rangos¶
Son una colección de números enteros, pero que funciona con evaluación perezosa (los datos se calculan a medida que se necesitan), un Rango tiene 3 elementos
- Valor inicial
- Valor final
- El incremento/decremento
scala> 0 to 3
val res9: scala.collection.immutable.Range.Inclusive = Range 0 to 3
scala> (0 to 3).toVector
val res10: scala.collection.immutable.Vector[Int] = Vector(0, 1, 2, 3)
scala> 0 until 3
val res11: scala.collection.immutable.Range = Range 0 until 3
scala> (0 until 3).toVector
val res12: scala.collection.immutable.Vector[Int] = Vector(0, 1, 2)
scala> (0 to 200 by 2).toVector
val res13: scala.collection.immutable.Vector[Int] = Vector(0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 142, 144, 146, 148, 150, 152, 154, 156, 158, 160, 162, 164, 166, 168, 170, 172, 174, 176, 178, 180, 182, 184, 186, 188, 190, 192, 194, 196, 198, 200)
scala> (1 to -10).toList
val res14: List[Int] = List()
scala> (1 to -10 by -1).toList
val res15: List[Int] = List(1, 0, -1, -2, -3, -4, -5, -6, -7, -8, -9, -10)
Los rangos en sí no se evaluan, sin embargo, internamente se transforman a un IndexedSeq que es casteado a Vector
scala> (0 to 10) map (x => x*x)
val res3: IndexedSeq[Int] = Vector(0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100)
Dada que la conversión no es controlada es mejor trasnformarlo a un Array o un Vector directamente
scala> (0 to 10).toArray map (x => x*x)
val res2: Array[Int] = Array(0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100)
Los tipos de rangos son:
- Inclusivos: to
- No inclusivos: until
String¶
Los String son una colección de char, que es inmutable y es equivalente a las otras colecciones como List, Array o Vector, solo que su tipo es estrictamente coleccion Char
scala> val f = "Hola mundo"
val f: String = Hola mundo
scala> f(0)
val res5: Char = H
scala> 'a' + f
^
warning: method + in class Char is deprecated (since 2.13.0): Adding a number and a String is deprecated. Use the string interpolation `s"$num$str"`
val res6: String = aHola mundo
scala> f
val res7: String = Hola mundo
scala> f map (x => x.toUpper)
val res8: String = HOLA MUNDO
scala> f map (_ < 'b')
val res10: IndexedSeq[Boolean] = ArraySeq(true, false, false, true, true, false, false, false, false, false)
scala> f filter (_ < 'b')
val res11: String = "Ha "
scala> 'A'.toInt
val res12: Int = 65
scala> 'a'.toInt
val res13: Int = 97
scala> f
val res14: String = Hola mundo
scala> f.toArray
val res15: Array[Char] = Array(H, o, l, a, , m, u, n, d, o)
scala> f.toList
val res16: List[Char] = List(H, o, l, a, , m, u, n, d, o)
scala> f.toVector
val res17: scala.collection.immutable.Vector[Char] = Vector(H, o, l, a, , m, u, n, d, o)