Kolekcje Scala - lista
Listy Scala są dość podobne do tablic, co oznacza, że wszystkie elementy listy mają ten sam typ, ale istnieją dwie ważne różnice. Po pierwsze, listy są niezmienne, co oznacza, że elementów listy nie można zmieniać przez przypisanie. Po drugie, listy reprezentują listę połączoną, podczas gdy tablice są płaskie.
Typ listy zawierającej elementy typu T jest zapisywany jako List[T].
Wypróbuj następujący przykład, oto kilka list zdefiniowanych dla różnych typów danych.
// 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)
)
Wszystkie listy można zdefiniować za pomocą dwóch podstawowych bloków konstrukcyjnych, ogona Nil i ::, który jest wymawiany cons. Brak reprezentuje również pustą listę. Wszystkie powyższe listy można zdefiniować w następujący sposób.
// 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
Podstawowe operacje na listach
Wszystkie operacje na listach można wyrazić za pomocą następujących trzech metod.
Sr.No | Metody i opis |
---|---|
1 | head Ta metoda zwraca pierwszy element listy. |
2 | tail Ta metoda zwraca listę zawierającą wszystkie elementy oprócz pierwszego. |
3 | isEmpty Ta metoda zwraca wartość true, jeśli lista jest pusta, w przeciwnym razie false. |
Poniższy przykład pokazuje, jak używać powyższych metod.
Przykład
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 )
}
}
Zapisz powyższy program w formacie Demo.scala. Poniższe polecenia służą do kompilowania i wykonywania tego programu.
Komenda
\>scalac Demo.scala
\>scala Demo
Wynik
Head of fruit : apples
Tail of fruit : List(oranges, pears)
Check if fruit is empty : false
Check if nums is empty : true
Listy łączone
Możesz użyć jednego z nich ::: operator lub List.:::() metoda lub List.concat()metoda dodawania dwóch lub więcej list. Proszę znaleźć następujący przykład podany poniżej -
Przykład
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 )
}
}
Zapisz powyższy program w formacie Demo.scala. Poniższe polecenia służą do kompilowania i wykonywania tego programu.
Komenda
\>scalac Demo.scala
\>scala Demo
Wynik
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)
Tworzenie jednolitych list
Możesz użyć List.fill()metoda tworzy listę składającą się z zera lub więcej kopii tego samego elementu. Wypróbuj następujący przykładowy program.
Przykład
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 )
}
}
Zapisz powyższy program w formacie Demo.scala. Poniższe polecenia służą do kompilowania i wykonywania tego programu.
Komenda
\>scalac Demo.scala
\>scala Demo
Wynik
fruit : List(apples, apples, apples)
num : List(2, 2, 2, 2, 2, 2, 2, 2, 2, 2)
Tabelarowanie funkcji
Możesz użyć funkcji wraz z List.tabulate()metodę, która ma być zastosowana do wszystkich elementów listy przed umieszczeniem listy w tabeli. Jego argumenty są takie same, jak te z List.fill: pierwszy argument lista podaje wymiary listy do utworzenia, a drugi opisuje elementy listy. Jedyna różnica polega na tym, że zamiast naprawianych elementów są one obliczane z funkcji.
Wypróbuj następujący przykładowy program.
Przykład
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 )
}
}
Zapisz powyższy program w formacie Demo.scala. Poniższe polecenia służą do kompilowania i wykonywania tego programu.
Komenda
\>scalac Demo.scala
\>scala Demo
Wynik
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))
Odwróć kolejność listy
Możesz użyć List.reversemetoda odwrócenia wszystkich elementów listy. Poniższy przykład pokazuje użycie.
Przykład
object Demo {
def main(args: Array[String]) {
val fruit = "apples" :: ("oranges" :: ("pears" :: Nil))
println( "Before reverse fruit : " + fruit )
println( "After reverse fruit : " + fruit.reverse )
}
}
Zapisz powyższy program w formacie Demo.scala. Poniższe polecenia służą do kompilowania i wykonywania tego programu.
Komenda
\>scalac Demo.scala
\>scala Demo
Wynik
Before reverse fruit : List(apples, oranges, pears)
After reverse fruit : List(pears, oranges, apples)