Colecciones Scala - Lista
Las listas Scala son bastante similares a las matrices, lo que significa que todos los elementos de una lista tienen el mismo tipo, pero hay dos diferencias importantes. Primero, las listas son inmutables, lo que significa que los elementos de una lista no se pueden cambiar por asignación. En segundo lugar, las listas representan una lista vinculada, mientras que las matrices son planas.
El tipo de lista que tiene elementos de tipo T se escribe como List[T].
Pruebe el siguiente ejemplo, aquí hay algunas listas definidas para varios tipos de datos.
// List of Strings
val fruit: List[String] = List("apples", "oranges", "pears")
// List of Integers
val nums: List[Int] = List(1, 2, 3, 4)
// Empty List.
val empty: List[Nothing] = List()
// Two dimensional list
val dim: List[List[Int]] = List(
List(1, 0, 0),
List(0, 1, 0),
List(0, 0, 1)
)
Todas las listas se pueden definir utilizando dos bloques de construcción fundamentales, una cola Nil y ::, que se pronuncia cons. Nil también representa la lista vacía. Todas las listas anteriores se pueden definir de la siguiente manera.
// List of Strings
val fruit = "apples" :: ("oranges" :: ("pears" :: Nil))
// List of Integers
val nums = 1 :: (2 :: (3 :: (4 :: Nil)))
// Empty List.
val empty = Nil
// Two dimensional list
val dim = (1 :: (0 :: (0 :: Nil))) ::
(0 :: (1 :: (0 :: Nil))) ::
(0 :: (0 :: (1 :: Nil))) :: Nil
Operaciones básicas en listas
Todas las operaciones en listas se pueden expresar en términos de los siguientes tres métodos.
No Señor | Métodos y descripción |
---|---|
1 | head Este método devuelve el primer elemento de una lista. |
2 | tail Este método devuelve una lista que consta de todos los elementos excepto el primero. |
3 | isEmpty Este método devuelve verdadero si la lista está vacía; de lo contrario, es falso. |
El siguiente ejemplo muestra cómo utilizar los métodos anteriores.
Ejemplo
object Demo {
def main(args: Array[String]) {
val fruit = "apples" :: ("oranges" :: ("pears" :: Nil))
val nums = Nil
println( "Head of fruit : " + fruit.head )
println( "Tail of fruit : " + fruit.tail )
println( "Check if fruit is empty : " + fruit.isEmpty )
println( "Check if nums is empty : " + nums.isEmpty )
}
}
Guarde el programa anterior en Demo.scala. Los siguientes comandos se utilizan para compilar y ejecutar este programa.
Mando
\>scalac Demo.scala
\>scala Demo
Salida
Head of fruit : apples
Tail of fruit : List(oranges, pears)
Check if fruit is empty : false
Check if nums is empty : true
Listas de concatenación
Puedes usar cualquiera ::: operador o List.:::() método o List.concat()método para agregar dos o más listas. Encuentre el siguiente ejemplo que se muestra a continuación:
Ejemplo
object Demo {
def main(args: Array[String]) {
val fruit1 = "apples" :: ("oranges" :: ("pears" :: Nil))
val fruit2 = "mangoes" :: ("banana" :: Nil)
// use two or more lists with ::: operator
var fruit = fruit1 ::: fruit2
println( "fruit1 ::: fruit2 : " + fruit )
// use two lists with Set.:::() method
fruit = fruit1.:::(fruit2)
println( "fruit1.:::(fruit2) : " + fruit )
// pass two or more lists as arguments
fruit = List.concat(fruit1, fruit2)
println( "List.concat(fruit1, fruit2) : " + fruit )
}
}
Guarde el programa anterior en Demo.scala. Los siguientes comandos se utilizan para compilar y ejecutar este programa.
Mando
\>scalac Demo.scala
\>scala Demo
Salida
fruit1 ::: fruit2 : List(apples, oranges, pears, mangoes, banana)
fruit1.:::(fruit2) : List(mangoes, banana, apples, oranges, pears)
List.concat(fruit1, fruit2) : List(apples, oranges, pears, mangoes, banana)
Crear listas uniformes
Puedes usar List.fill()El método crea una lista que consta de cero o más copias del mismo elemento. Pruebe el siguiente programa de ejemplo.
Ejemplo
object Demo {
def main(args: Array[String]) {
val fruit = List.fill(3)("apples") // Repeats apples three times.
println( "fruit : " + fruit )
val num = List.fill(10)(2) // Repeats 2, 10 times.
println( "num : " + num )
}
}
Guarde el programa anterior en Demo.scala. Los siguientes comandos se utilizan para compilar y ejecutar este programa.
Mando
\>scalac Demo.scala
\>scala Demo
Salida
fruit : List(apples, apples, apples)
num : List(2, 2, 2, 2, 2, 2, 2, 2, 2, 2)
Tabulación de una función
Puede utilizar una función junto con List.tabulate()método para aplicar en todos los elementos de la lista antes de tabular la lista. Sus argumentos son como los de List.fill: la primera lista de argumentos da las dimensiones de la lista a crear, y la segunda describe los elementos de la lista. La única diferencia es que en lugar de que los elementos sean fijos, se calculan a partir de una función.
Pruebe el siguiente programa de ejemplo.
Ejemplo
object Demo {
def main(args: Array[String]) {
// Creates 5 elements using the given function.
val squares = List.tabulate(6)(n => n * n)
println( "squares : " + squares )
val mul = List.tabulate( 4,5 )( _ * _ )
println( "mul : " + mul )
}
}
Guarde el programa anterior en Demo.scala. Los siguientes comandos se utilizan para compilar y ejecutar este programa.
Mando
\>scalac Demo.scala
\>scala Demo
Salida
squares : List(0, 1, 4, 9, 16, 25)
mul : 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))
Orden de lista inverso
Puedes usar List.reversemétodo para invertir todos los elementos de la lista. El siguiente ejemplo muestra el uso.
Ejemplo
object Demo {
def main(args: Array[String]) {
val fruit = "apples" :: ("oranges" :: ("pears" :: Nil))
println( "Before reverse fruit : " + fruit )
println( "After reverse fruit : " + fruit.reverse )
}
}
Guarde el programa anterior en Demo.scala. Los siguientes comandos se utilizan para compilar y ejecutar este programa.
Mando
\>scalac Demo.scala
\>scala Demo
Salida
Before reverse fruit : List(apples, oranges, pears)
After reverse fruit : List(pears, oranges, apples)