Collezioni Scala - Elenco
Gli elenchi Scala sono abbastanza simili agli array, il che significa che tutti gli elementi di un elenco hanno lo stesso tipo ma ci sono due differenze importanti. Innanzitutto, gli elenchi sono immutabili, il che significa che gli elementi di un elenco non possono essere modificati per assegnazione. In secondo luogo, gli elenchi rappresentano un elenco collegato mentre gli array sono piatti.
Il tipo di un elenco che contiene elementi di tipo T è scritto come List[T].
Prova il seguente esempio, ecco alcuni elenchi definiti per vari tipi di dati.
// 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)
)
Tutti gli elenchi possono essere definiti utilizzando due elementi costitutivi fondamentali, una coda Nil e ::, che è pronunciato cons. Nil rappresenta anche l'elenco vuoto. Tutti gli elenchi di cui sopra possono essere definiti come segue.
// 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
Operazioni di base sugli elenchi
Tutte le operazioni sulle liste possono essere espresse nei termini delle seguenti tre modalità.
Suor n | Metodi e descrizione |
---|---|
1 | head Questo metodo restituisce il primo elemento di un elenco. |
2 | tail Questo metodo restituisce un elenco composto da tutti gli elementi tranne il primo. |
3 | isEmpty Questo metodo restituisce true se l'elenco è vuoto, altrimenti false. |
L'esempio seguente mostra come utilizzare i metodi precedenti.
Esempio
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 )
}
}
Salvare il programma sopra in formato Demo.scala. I seguenti comandi vengono utilizzati per compilare ed eseguire questo programma.
Comando
\>scalac Demo.scala
\>scala Demo
Produzione
Head of fruit : apples
Tail of fruit : List(oranges, pears)
Check if fruit is empty : false
Check if nums is empty : true
Elenchi concatenati
Puoi usare entrambi ::: operatore o List.:::() metodo o List.concat()metodo per aggiungere due o più elenchi. Si prega di trovare il seguente esempio riportato di seguito:
Esempio
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 )
}
}
Salvare il programma sopra in formato Demo.scala. I seguenti comandi vengono utilizzati per compilare ed eseguire questo programma.
Comando
\>scalac Demo.scala
\>scala Demo
Produzione
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)
Creazione di elenchi uniformi
Puoi usare List.fill()Il metodo crea una lista composta da zero o più copie dello stesso elemento. Prova il seguente programma di esempio.
Esempio
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 )
}
}
Salvare il programma sopra in formato Demo.scala. I seguenti comandi vengono utilizzati per compilare ed eseguire questo programma.
Comando
\>scalac Demo.scala
\>scala Demo
Produzione
fruit : List(apples, apples, apples)
num : List(2, 2, 2, 2, 2, 2, 2, 2, 2, 2)
Tabulare una funzione
Puoi usare una funzione insieme a List.tabulate()metodo da applicare su tutti gli elementi della lista prima di tabulare la lista. I suoi argomenti sono proprio come quelli di List.fill: il primo argomento list fornisce le dimensioni della lista da creare, e il secondo descrive gli elementi della lista. L'unica differenza è che invece di fissare gli elementi, vengono calcolati da una funzione.
Prova il seguente programma di esempio.
Esempio
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 )
}
}
Salvare il programma sopra in formato Demo.scala. I seguenti comandi vengono utilizzati per compilare ed eseguire questo programma.
Comando
\>scalac Demo.scala
\>scala Demo
Produzione
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))
Ordine elenco inverso
Puoi usare List.reversemetodo per invertire tutti gli elementi della lista. L'esempio seguente mostra l'utilizzo.
Esempio
object Demo {
def main(args: Array[String]) {
val fruit = "apples" :: ("oranges" :: ("pears" :: Nil))
println( "Before reverse fruit : " + fruit )
println( "After reverse fruit : " + fruit.reverse )
}
}
Salvare il programma sopra in formato Demo.scala. I seguenti comandi vengono utilizzati per compilare ed eseguire questo programma.
Comando
\>scalac Demo.scala
\>scala Demo
Produzione
Before reverse fruit : List(apples, oranges, pears)
After reverse fruit : List(pears, oranges, apples)