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)