Bộ sưu tập Scala - Danh sách
Scala Lists khá giống với mảng có nghĩa là, tất cả các phần tử của một danh sách có cùng một kiểu nhưng có hai điểm khác biệt quan trọng. Đầu tiên, danh sách là bất biến, có nghĩa là các phần tử của danh sách không thể thay đổi bằng cách gán. Thứ hai, danh sách đại diện cho một danh sách được liên kết trong khi các mảng là phẳng.
Loại danh sách có các phần tử thuộc loại T được viết là List[T].
Hãy thử ví dụ sau, đây là một vài danh sách được xác định cho các kiểu dữ liệu khác nhau.
// 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)
)
Tất cả các danh sách có thể được xác định bằng cách sử dụng hai khối xây dựng cơ bản, một Nil và ::, được phát âm cons. Nil cũng đại diện cho danh sách trống. Tất cả các danh sách trên có thể được định nghĩa như sau.
// 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
Các thao tác cơ bản trên danh sách
Tất cả các hoạt động trên danh sách có thể được thể hiện theo ba phương pháp sau.
Sr.No | Phương pháp & Mô tả |
---|---|
1 | head Phương thức này trả về phần tử đầu tiên của danh sách. |
2 | tail Phương thức này trả về một danh sách bao gồm tất cả các phần tử ngoại trừ phần tử đầu tiên. |
3 | isEmpty Phương thức này trả về true nếu danh sách trống, ngược lại là false. |
Ví dụ sau đây cho thấy cách sử dụng các phương pháp trên.
Thí dụ
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 )
}
}
Lưu chương trình trên vào Demo.scala. Các lệnh sau được sử dụng để biên dịch và thực thi chương trình này.
Chỉ huy
\>scalac Demo.scala
\>scala Demo
Đầu ra
Head of fruit : apples
Tail of fruit : List(oranges, pears)
Check if fruit is empty : false
Check if nums is empty : true
Nối danh sách
Bạn có thể sử dụng ::: nhà điều hành hoặc List.:::() phương pháp hoặc List.concat()để thêm hai hoặc nhiều danh sách. Vui lòng tìm ví dụ sau được đưa ra bên dưới:
Thí dụ
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 )
}
}
Lưu chương trình trên vào Demo.scala. Các lệnh sau được sử dụng để biên dịch và thực thi chương trình này.
Chỉ huy
\>scalac Demo.scala
\>scala Demo
Đầu ra
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)
Tạo danh sách thống nhất
Bạn có thể dùng List.fill()phương thức tạo một danh sách bao gồm không hoặc nhiều bản sao của cùng một phần tử. Hãy thử chương trình ví dụ sau.
Thí dụ
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 )
}
}
Lưu chương trình trên vào Demo.scala. Các lệnh sau được sử dụng để biên dịch và thực thi chương trình này.
Chỉ huy
\>scalac Demo.scala
\>scala Demo
Đầu ra
fruit : List(apples, apples, apples)
num : List(2, 2, 2, 2, 2, 2, 2, 2, 2, 2)
Lập bảng một hàm
Bạn có thể sử dụng một hàm cùng với List.tabulate()để áp dụng trên tất cả các phần tử của danh sách trước khi lập bảng danh sách. Các đối số của nó giống như đối số của List.fill: danh sách đối số đầu tiên cung cấp các kích thước của danh sách để tạo và đối số thứ hai mô tả các phần tử của danh sách. Sự khác biệt duy nhất là thay vì các phần tử được cố định, chúng được tính toán từ một hàm.
Hãy thử chương trình ví dụ sau.
Thí dụ
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 )
}
}
Lưu chương trình trên vào Demo.scala. Các lệnh sau được sử dụng để biên dịch và thực thi chương trình này.
Chỉ huy
\>scalac Demo.scala
\>scala Demo
Đầu ra
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))
Đảo ngược thứ tự danh sách
Bạn có thể dùng List.reversephương pháp đảo ngược tất cả các phần tử của danh sách. Ví dụ sau đây cho thấy cách sử dụng.
Thí dụ
object Demo {
def main(args: Array[String]) {
val fruit = "apples" :: ("oranges" :: ("pears" :: Nil))
println( "Before reverse fruit : " + fruit )
println( "After reverse fruit : " + fruit.reverse )
}
}
Lưu chương trình trên vào Demo.scala. Các lệnh sau được sử dụng để biên dịch và thực thi chương trình này.
Chỉ huy
\>scalac Demo.scala
\>scala Demo
Đầu ra
Before reverse fruit : List(apples, oranges, pears)
After reverse fruit : List(pears, oranges, apples)