Scala List (Lista)

Scala 集合Colecciones de Scala

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

// Lista de cadenas
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

// Lista de cadenas
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

// Lista de cadenas
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

object Test {
   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

object Test {
   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

object Test {
   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

object Test {
   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

Scala 集合Colecciones de Scala

Otras extensiones