Scala List (Lista)
Las listas de Scala son similares a los arrays, todos sus elementos son del mismo tipo, pero también difieren: las listas son inmutables, una vez que se define un valor no se puede cambiar; además, las listas tienen una estructura recursiva (es decir, estructura de lista enlazada) mientras que los arrays no.
El tipo de elemento T de una lista se puede escribir como List[T]. Por ejemplo, a continuación se muestran listas de varios tipos:
Ejemplo
val site: List[String] = List("Ejemplo", "Google", "Baidu")
// Lista de enteros
val nums: List[Int] = List(1, 2, 3, 4)
// Lista vacía
val empty: List[Nothing] = List()
// Lista bidimensional
val dim: List[List[Int]] =
List(
List(1, 0, 0),
List(0, 1, 0),
List(0, 0, 1)
)
Las dos unidades básicas para construir listas sonNily::
NilTambién se puede representar como una lista vacía.
El ejemplo anterior lo podemos escribir de la siguiente manera:
Ejemplo
val site = "Ejemplo" :: ("Google" :: ("Baidu" :: Nil))
// Lista de enteros
val nums = 1 :: (2 :: (3 :: (4 :: Nil)))
// Lista vacía
val empty = Nil
// Lista bidimensional
val dim = (1 :: (0 :: (0 :: Nil))) ::
(0 :: (1 :: (0 :: Nil))) ::
(0 :: (0 :: (1 :: Nil))) :: Nil
Operaciones básicas de listas
Las listas de Scala tienen tres operaciones básicas:
-
headDevuelve el primer elemento de la lista -
tailDevuelve una lista con todos los elementos excepto el primero -
isEmptyDevuelve true si la lista está vacía
Cualquier operación con listas de Scala puede expresarse con estas tres operaciones básicas. Ejemplo:
Ejemplo
object Test {
def main(args: Array[String]) {
val site = "Ejemplo" :: ("Google" :: ("Baidu" :: Nil))
val nums = Nil
println( El primer sitio web es: + site.head )
println( El último sitio web es: + site.tail )
println( Comprueba si la lista site está vacía: + site.isEmpty )
println( Comprueba si nums está vacía: + nums.isEmpty )
}
}
Al ejecutar el código anterior, el resultado es:
$ vim Test.scala $ scala Test.scala 第一网站是 : Ejemplo 最后一个网站是 : List(Google, Baidu) 查看列表 site 是否为空 : false 查看 nums 是否为空 : true
Concatenar listas
Puedes usar:::el operador oList.:::()el método oList.concat()el método para concatenar dos o más listas. Ejemplo:
Ejemplo
def main(args: Array[String]) {
val site1 = "Ejemplo" :: ("Google" :: ("Baidu" :: Nil))
val site2 = "Facebook" :: ("Taobao" :: Nil)
// Usando el operador :::
var fruit = site1 ::: site2
println( "site1 ::: site2 : " + fruit )
// Usando el método List.:::()
fruit = site1.:::(site2)
println( "site1.:::(site2) : " + fruit )
// Usando el método concat
fruit = List.concat(site1, site2)
println( "List.concat(site1, site2) : " + fruit )
}
}
Al ejecutar el código anterior, el resultado es:
$ vim Test.scala $ scala Test.scala site1 ::: site2 : List(Ejemplo, Google, Baidu, Facebook, Taobao) site1.:::(site2) : List(Facebook, Taobao, Ejemplo, Google, Baidu) List.concat(site1, site2) : List(Ejemplo, Google, Baidu, Facebook, Taobao)
List.fill()
Podemos usar el método List.fill() para crear una lista con un número especificado de elementos repetidos:
Ejemplo
def main(args: Array[String]) {
val site = List.fill(3)("Ejemplo") // Repetir Ejemplo 3 veces
println( "site : " + site )
val num = List.fill(10)(2) // Repetir el elemento 2 10 veces
println( "num : " + num )
}
}
Al ejecutar el código anterior, el resultado es:
$ vim Test.scala $ scala Test.scala site : List(Ejemplo, Ejemplo, Ejemplo) num : List(2, 2, 2, 2, 2, 2, 2, 2, 2, 2)
List.tabulate()
El método List.tabulate() crea una lista mediante una función dada.
El primer parámetro del método es el número de elementos, puede ser bidimensional; el segundo parámetro es la función especificada. Calculamos el resultado mediante la función y devolvemos el valor insertándolo en la lista, con valor inicial 0. Ejemplo:Ejemplo
def main(args: Array[String]) {
// Crear 5 elementos mediante la función dada
val squares = List.tabulate(6)(n => n * n)
println( Unidimensional: + squares )
// Crear una lista bidimensional
val mul = List.tabulate( 4,5 )( _ * _ )
println( Multidimensional: + mul )
}
}
Al ejecutar el código anterior, el resultado es:
$ vim Test.scala $ scala Test.scala 一维 : List(0, 1, 4, 9, 16, 25) 多维 : List(List(0, 0, 0, 0, 0), List(0, 1, 2, 3, 4), List(0, 2, 4, 6, 8), List(0, 3, 6, 9, 12))
List.reverse
List.reverse se utiliza para invertir el orden de la lista. Ejemplo:
Ejemplo
def main(args: Array[String]) {
val site = "Ejemplo" :: ("Google" :: ("Baidu" :: Nil))
println( site antes de invertir: + site )
println( site después de invertir: + site.reverse )
}
}
Al ejecutar el código anterior, el resultado es:
$ vim Test.scala $ scala Test.scala site 反转前 : List(Ejemplo, Google, Baidu) site 反转后 : List(Baidu, Google, Ejemplo)
Métodos comunes de Scala List
La siguiente tabla enumera los métodos comunes de Scala List:
| N.º | Método y descripción |
|---|---|
| 1 |
def +:(elem: A): List[A] Agrega un elemento al principio de la lista scala> val x = List(1) x: List[Int] = List(1) scala> val y = 2 +: x y: List[Int] = List(2, 1) scala> println(x) List(1) |
| 2 |
def ::(x: A): List[A] Agrega un elemento al comienzo de la lista |
| 3 |
def :::(prefix: List[A]): List[A] Agrega los elementos de la lista especificada al comienzo de la lista |
| 4 |
def :+(elem: A): List[A] Devuelve una copia de la lista con el elemento añadido scala> val a = List(1) a: List[Int] = List(1) scala> val b = a :+ 2 b: List[Int] = List(1, 2) scala> println(a) List(1) |
| 5 |
def addString(b: StringBuilder): StringBuilder Agrega todos los elementos de la lista a StringBuilder |
| 6 |
def addString(b: StringBuilder, sep: String): StringBuilder Agrega todos los elementos de la lista a StringBuilder, especificando el separador |
| 7 |
def apply(n: Int): A Obtiene el elemento mediante el índice de la lista |
| 8 |
def contains(elem: Any): Boolean Comprueba si la lista contiene el elemento especificado |
| 9 |
def copyToArray(xs: Array[A], start: Int, len: Int): Unit Copia los elementos de la lista a un array |
| 10 |
def distinct: List[A] Elimina los elementos duplicados de la lista y devuelve una nueva lista |
| 11 |
def drop(n: Int): List[A] Descarta los primeros n elementos y devuelve una nueva lista |
| 12 |
def dropRight(n: Int): List[A] Descarta los últimos n elementos y devuelve una nueva lista |
| 13 |
def dropWhile(p: (A) => Boolean): List[A] Descarta elementos de izquierda a derecha hasta que la condición p no se cumpla |
| 14 |
def endsWith[B](that: Seq[B]): Boolean Comprueba si la lista termina con la secuencia especificada |
| 15 |
def equals(that: Any): Boolean Determina si son iguales |
| 16 |
def exists(p: (A) => Boolean): Boolean Comprueba si existe algún elemento en la lista que cumpla la condición especificada Comprueba si existe algún elemento en l: scala> l.exists(s => s == "Hah") res7: Boolean = true |
| 17 |
def filter(p: (A) => Boolean): List[A] Devuelve todos los elementos que cumplen la condición especificada Filtra los elementos de longitud 3: scala> l.filter(s => s.length == 3) res8: List[String] = List(Hah, WOW) |
| 18 |
def forall(p: (A) => Boolean): Boolean Comprueba todos los elementos Por ejemplo: comprobar si todos los elementos comienzan con "H": scala> l.forall(s => s.startsWith("H")) res10: Boolean = false |
| 19 |
def foreach(f: (A) => Unit): Unit Aplica la función a todos los elementos de la lista |
| 20 |
def head: A Obtiene el primer elemento de la lista |
| 21 |
def indexOf(elem: A, from: Int): Int Desde la posición especificada from, busca la primera aparición del elemento |
| 22 |
def init: List[A] Devuelve todos los elementos excepto el último |
| 23 |
def intersect(that: Seq[A]): List[A] Calcula la intersección de varias colecciones |
| 24 |
def isEmpty: Boolean Comprueba si la lista está vacía |
| 25 |
def iterator: Iterator[A] Crea un nuevo iterador para iterar sobre los elementos |
| 26 |
def last: A Devuelve el último elemento |
| 27 |
def lastIndexOf(elem: A, end: Int): Int Busca la última aparición del elemento comenzando en la posición especificada end |
| 28 |
def length: Int Devuelve la longitud de la lista |
| 29 |
def map[B](f: (A) => B): List[B] Recalcula todos los elementos mediante el método dado |
| 30 |
def max: A Busca el elemento máximo |
| 31 |
def min: A Busca el elemento mínimo |
| 32 |
def mkString: String Muestra todos los elementos de la lista como una cadena |
| 33 |
def mkString(sep: String): String Muestra todos los elementos de la lista como una cadena utilizando un separador |
| 34 |
def reverse: List[A] Invierte la lista |
| 35 |
def sorted[B >: A]: List[A] Ordena la lista |
| 36 |
def startsWith[B](that: Seq[B], offset: Int): Boolean Comprueba si la lista contiene la secuencia especificada en la posición especificada |
| 37 |
def sum: A Calcula la suma de los elementos de la colección |
| 38 |
def tail: List[A] Devuelve todos los elementos excepto el primero |
| 39 |
def take(n: Int): List[A] Extrae los primeros n elementos de la lista |
| 40 |
def takeRight(n: Int): List[A] Extrae los últimos n elementos de la lista |
| 41 |
def toArray: Array[A] Convierte la lista en un array |
| 42 |
def toBuffer[B >: A]: Buffer[B] Devuelve un buffer que contiene todos los elementos de la lista |
| 43 |
def toMap[T, U]: Map[T, U] Convierte List en Map |
| 44 |
def toSeq: Seq[A] Convierte List en Seq |
| 45 |
def toSet[B >: A]: Set[B] Convierte List en Set |
| 46 |
def toString(): String Convierte la lista en una cadena |
Para más métodos, consultaDocumentación de la API
Otras extensiones
Colecciones de Scala