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::, đượ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)