Scala Collection – Map

Scala Map là một collection theo cặp key và value, hay có thể gọi nó là một hash table. Chúng ta có thể sử dụng key để truy cập một giá trị trong map. Những key này là duy nhất, value thì không cần. Scala map có 2 kiểu là mutable và immutable. Mặc định của nó là immutable. Để sử dụng một mutbale Map chúng ta phải sử dụng class scala.collection.mutable.Map.  Để sử dụng cả hai trong cùng một chỗ thì chúng ta có thể tham chiếu immutable Map bằng Map và mutable Map bằng mutable.Map

Hãy cùng xem ví dụ Map sau của một sinh viên với studentId là key còn name là value

val student = Map(12 -> "Reena", 13 -> "Micheal" , 14 -> "Peter")

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

Các phương thức cơ bản được hỗ trợ là

  • keys: Trả về iterator chứa các key trong Map
  • values: Trả về một iterator chứa các value trong Map
  • isEmpty: Trả về true nếu Map là rỗng

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

object MapOperations {
  def main(args: Array[String]) {
    val student = Map(12 -> "Reena", 13 -> "Micheal", 14 -> "Peter")

    val marks: Map[String, Int] = Map()

    println("Keys : " + student.keys)
    println("Values : " + student.values)
    println("Check if student is empty : " + student.isEmpty)
    println("Check if marks is empty : " + marks.isEmpty)
  }
}

Kết quả

Keys : Set(12, 13, 14)
Values : MapLike(Reena, Micheal, Peter)
Check if student is empty : false
Check if marks is empty : true

Nối các Map

Toán tử ++ hoặc Map.++() dùng để nối 2 hoặc nhiều Map lại với nhau nhưng các key trùng lặp sẽ bị loại bỏ

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

object ConcatMaps {
   def main(args: Array[String]) {
     val stud1 = Map(12 -> "Reena", 13 -> "Micheal" , 14 -> "Peter")
     val stud2 = Map(15 -> "Russel", 16 -> "Mark" , 17 -> "Steve")
	 
     var student = stud1 ++ stud2
     println( "stud1 ++ stud2 : " + student )

     val stu = stud1.++(stud2)
     println( "stud1.++(stud2)) : " + stu )
   }
}

Kết quả

stud1 ++ stud2 : Map(14 -> Peter, 13 -> Micheal, 17 -> Steve, 12 -> Reena, 16 -> Mark, 15 -> Russel)
stud1.++(stud2)) : Map(14 -> Peter, 13 -> Micheal, 17 -> Steve, 12 -> Reena, 16 -> Mark, 15 -> Russel)

In các key và value trong Map

Vòng lặp foreach được dùng để lặp tất cả các cặp key và value trong Map

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

object KeyValues {
  def main(args: Array[String]) {
    val stud2 = Map(15 -> "Russel", 16 -> "Mark" , 17 -> "Steve")
    stud2.keys.foreach{ i =>  
      print( "Key = " + i )
      println(" Value = " + stud2(i) )}
   }
}

Kết quả

Key = 15 Value = Russel
Key = 16 Value = Mark
Key = 17 Value = Steve

Kiểm tra key trong Map

Phương thức Map.contains dùng để kiểm tra một key có tồn tại trong Map hay không

object Keyexists {
   def main(args: Array[String]) {
     val stud2 = Map(15 -> "Russel", 16 -> "Mark" , 17 -> "Steve")

     if( stud2.contains( 15 )) {
       	println("Student Id 15 exists with value :"  + stud2(15))
     } else {
       	println("Student Id with 15 does not exist")
     }
  	
     if( stud2.contains(16)) {
       	println("Student Id 16  exists with value :"  + stud2(16))
     } else{
       	println("Student Id 16 does not exist")
     }
  	
     if(stud2.contains(17)) {
       	println("Student Id 17  exists with value :"  + stud2(17))
     } else {
       	println("Student Id 17 does not exist")
     }
     
     if( stud2.contains( 18 )){
       	println("Student Id 18  exists with value :"  + stud2(18))
     } else {
       	println("Student Id 18 does not exist")
     }
   }
}

Kết quả

Student Id 15 exists with value :Russel
Student Id 16  exists with value :Mark
Student Id 17  exists with value :Steve
Student Id 18 does not exist

Các phương thức

Chúng ta sẽ tạo một Map m để làm ví dụ cho các phương thức như sau

scala> var m = Map("Ayushi"->0,"Megha"->1)
m: scala.collection.immutable.Map[String,Int] = Map(Ayushi -> 0, Megha -> 1)

Sau đó tạo một Map m1

scala> var m1 = Map("Megha"->3,"Ruchi"->2,"Becky"->4)
m1: scala.collection.immutable.Map[String,Int] = Map(Megha -> 3, Ruchi -> 2, Becky -> 4)

Một vài phương thức khác hữu hiệu là

  • def ++(xs: Map[(X, Y)]): Map[X, Y] → Trả về một Map mới bao gồm Map hiện tại và những cái được cung cấp bởi Map a
scala> m.++(m1)
res15: scala.collection.immutable.Map[String,Int] = Map(Ayushi -> 0, Megha -> 3, Ruchi -> 2, Becky -> 4)
scala> m1.++(m)
res16: scala.collection.immutable.Map[String,Int] = Map(Megha -> 1, Ruchi -> 2, Becky -> 4, Ayushi -> 0)
  • def -(e1: X, e2: X, elems: X*): Map[X, Y] → Trả về Map mới chứa các phần tử của Map hiện tại nhưng loại trừ nhưng key bằng e1, e2 hoặc bất kỳ elems nào.
scala> m.-("Ayushi","Ruchi")
res21: scala.collection.immutable.Map[String,Int] = Map(Megha -> 1)
  • def count(a: ((X, Y)) => Boolean): Int → Đếm số các phần tử
scala> m.count(x=>true)
res49: Int = 3
  • def max: (X,Y) → Tìm phần tử lớn nhất trong Map
scala> m.max
res86: (String, Int) = (Ruchi,2)
  • def min: (X,Y) → Tìm phần tử nhỏ nhất trong Map
scala> m.min
res87: (String, Int) = (Ayushi,0)

 

You May Also Like

About the Author: Nguyen Dinh Thuc

Leave a Reply

Your email address will not be published.