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)