Scala Collection – List

Scala collection là một container mà giữ tập hợp các phần tử được sắp xếp theo thứ tự như là List, Set, Tuple, Option, Map…Collection có thể là strict hoặc lazy. Bộ nhớ sẽ không được cấp phép nếu chúng chưa được truy cập. Collection có thể là mutable hoặc immutable.

Trong bài viết này chúng ta sẽ cùng nhau tìm hiểu về List

List

Các phần tử của List đều có cùng kiểu dữ liệu. List giống như là một array nhưng có 2 điểm khác đó là List có thể là một immutable và List miêu tả một danh sách nối tiếp trong khi array là phẳng, không thay đổi.

List được diễn tả bằng List[T], trong đó T là kiểu dữ liệu của các phần tử

Hãy cùng xem ví dụ sau

val StudentNames[String] = List("Rohan", "Andreas", "Rob", "John")

Có thể một List trống như sau

val em: List[Nothing] = List()

Có thể tạo một List 2 chiều như sau

val twodim: List[List[Int]] =
   List(
      List(1, 0, 0),
      List(0, 1, 0),
      List(0, 0, 1)
   )

Các hoạt động cơ bản

Các hoạt động cơ bản bao gồm

  • head: trả về phần tử đầu tiên của List
  • tail: Trả về tất cả các phần tử trừ phần tử đầu tiên
  • isEmpty: Trả về true nếu list là trống

Hãy cùng xem ví dụ về những hoạt động này

object Student {
  def main(args:Array[String]) {
    val names= "Harry" :: ("Adam" :: ("Jill" :: Nil))
    val age = Nil
    println( "Head of names array : " + names.head )
    println( "Tail of names array : " + names.tail )
    println( "Check if names is empty : " + names.isEmpty )
    println( "Check if age is empty : " + age.isEmpty )
 }
}

Chúng ta đang tạo một student object với 2 List là namesage. Chúng ta gọi các phương thức head, tail và isEmpty với names và isEmpty với age.

Để xem kết qủa bằng cách sử dụng câu lệnh Student.main(null) và kết quả nhận được như sau

Head of names array : Harry
Tail of names array : List(Adam, Jill) 
Check if names is empty : false
Check if age is empty : true

Bạn cũng có thể chạy đoạn code ở trên trong file Student.scala

$scalac Student.scala
$scala Student
Head of names array : Harry
Tail of names array : List(Adam, Jill)
Check if names is empty : false
Check if age is empty : true

Nối các List

Để nối các List chúng ta sử dụng ::: hoặc List().:::: hoặc phương thức concat để nối 2 hoặc nhiều List

Hãy cùng xem ví dụ bên dưới đây

object Country {
  def main(args:Array[String]) {
    val country_1 =  List("India","SriLanka","Algeria")
    val country_2 = List("Austria","Belgium","Canada")

    val country = country_1 ::: country_2
    println( "country_1 ::: country_2 : " + country )

    val cont = country_1.:::(country_2)
    println( "country_1.:::(country_2) : " + cont )
    val con = List.concat(country_1, country_2)
    println( "List.concat(country_1, country_2) : " + con  )
 }
}

Chúng ta tạo 2 List là country_1country_2 và nối lại với nhau thành country sử dụng toán tử :::. Trong trường hợp thứ 2, chúng ta sử dụng toán tử .::: để nối country_1country_2 thành cont và dữ liệu của list thứ 2 country_2 sẽ được chèn vào trước rồi mới đến dữ liệu của country_1 được hiện ra.

Cuối cùng chúng ta sử dụng phương thức concat để nối country_1country_2 thành con

Kết quả

country_1 ::: country_2 : List(India, SriLanka, Algeria, Austria, Belgium, Canada)
country_1.:::(country_2) : List(Austria, Belgium, Canada, India, SriLanka, Algeria)
List.concat(country_1, country_2) : List(India, SriLanka, Algeria, Austria, Belgium, Canada)

Reverse

Cấu trúc dữ liệu List cung cấp phương thức reverse để đảo ngược các phần tử của list

Hãy cùng xem ví dụ dưới đây

object Country {
  def main(args:Array[String]) {
    val country = List("Denmark","Sweden","France")
    println("Country List before reversal :" + country)
    println("Country List after reversal :" + country.reverse)
  }
}

Ở đây chúng ta sử dụng phương thức reverse để đảo ngược các phần tử của country

Kết quả

Country List before reversal :List(Denmark, Sweden, France)
Country List after reversal :List(France, Sweden, Denmark)

Tạo List giống nhau

Phương thức List.fill() tạo 0 hoặc nhiều hơn copy của cùng một phần tử

Hãy cùng xem ví dụ bên dưới đây

object Student {
   def main(args: Array[String]) {
      val name = List.fill(6)("Rehan") 
      println( "Name : " + name  )

      val id = List.fill(6)(12)         
      println( "Id : " + id  )
   }
}

Ở đây chúng ta sử dụng phương thức fill và tạo một List name với 6 phần tử có cùng một tên là “Rehan”. một list id với 6 phần tử với cùng một giá trị là 12

Kết quả

Name : List(Rehan, Rehan, Rehan, Rehan, Rehan, Rehan)
Id : List(12, 12, 12, 12, 12, 12)

Các phương thức

Sau đây là một số các phương thức được hỗ trợ trong List

  • def distinct: List[X] → Tạo một List mới từ một List mà không có phần tử nào trùng nhau
  • def indexOf(elem: X, from: Int): Int  Tìm index của giá trị xuất hiện đầu tiên trong List sau hoặc tại index bắt đầu.
  • def length: Int → Trả về độ dài của List
  • def sorted[Y >: X]: List[X] → Sắp xếp List theo thứ tự
  • def sum: A → Tính tổng của tất cả các phần tử trong List này
  • def toString(): String → Chuyển đổi List thành String
  • def min: A → Tìm phần tử nhỏ nhất
  • def max A → Tìm phần tử lớn nhất
  • def lastIndexOf(elem: A, end: Int): Int → Tìm index của giá trị xuất hiện cuối cùng trước hoặc tại index cuối cùng
  • def toMap[X, Y]: Map[X, Y] →  Chuyển đổi List thành Map

 

You May Also Like

About the Author: Nguyen Dinh Thuc

Leave a Reply

Your email address will not be published.