scala的多種集合的使用(6)之映射Map的操作方法


1.創建映射

1)創建不可變的映射

scala> val status = Map(1 -> "a",2 -> "b")
status: scala.collection.immutable.Map[Int,String] = Map(1 -> a, 2 -> b)

scala> val status = Map((1,"a"),(2,"b"))
status: scala.collection.immutable.Map[Int,String] = Map(1 -> a, 2 -> b)

2)創建可變的映射,要么用導入的方式將其帶入作用域中,要么就在創建實例時指定scala.collection.mutable.Map類的完整路徑。

scala> var status = collection.mutable.Map((1,"a"),(2,"b"))
status: scala.collection.mutable.Map[Int,String] = Map(2 -> b, 1 -> a)

3)在創建的時候創建一空可變的Map,之后在添加元素。

scala> var status = collection.mutable.Map[Int,String]()
status: scala.collection.mutable.Map[Int,String] = Map()

scala> status += ((1,"a"))
res38: scala.collection.mutable.Map[Int,String] = Map(1 -> a)

scala> status += ((3,"c"),(2,"b"))
res39: scala.collection.mutable.Map[Int,String] = Map(2 -> b, 1 -> a, 3 -> c)

2.Map使用的場景

1)想要返回元素按照鍵有序的映射,請使用SortedMap。

scala> import scala.collection.SortedMap
import scala.collection.SortedMap

scala> val grades = SortedMap(("kim",90),("al",86),("mes",88),("ema",78),("han",93))
grades: scala.collection.SortedMap[String,Int] = Map(al -> 86, ema -> 78, han ->93, kim -> 90, mes -> 88)

scala> val grades = SortedMap((1,90),(3,86),(2,88),(5,78),(4,93))
grades: scala.collection.SortedMap[Int,Int] = Map(1 -> 90, 2 -> 88, 3 -> 86, 4 -> 93, 5 -> 78)

2)按插入時的順序返回元素,只有可變的LinkedHashMap。

scala> import scala.collection.mutable.LinkedHashMap
import scala.collection.mutable.LinkedHashMap

scala> var status = LinkedHashMap((5,"apple"))
status: scala.collection.mutable.LinkedHashMap[Int,String] = Map(5 -> apple)

scala> status += ((3,"orange"))
res40: scala.collection.mutable.LinkedHashMap[Int,String] = Map(5 -> apple, 3 -> orange)

scala> status += ((6,"banana"))
res41: scala.collection.mutable.LinkedHashMap[Int,String] = Map(5 -> apple, 3 ->orange, 6 -> banana)

3)按插入時的相反順序返回元素,可以是可變的或者不可變的ListMap。

scala> import scala.collection.mutable.ListMap
import scala.collection.mutable.ListMap

scala> var status = ListMap((1,"a"))
status: scala.collection.mutable.ListMap[Int,String] = Map(1 -> a)

scala> status += ((1,"a"))
res43: scala.collection.mutable.ListMap[Int,String] = Map(1 -> a)

scala> status += ((2,"b"))
res44: scala.collection.mutable.ListMap[Int,String] = Map(2 -> b, 1 -> a)

scala> status += ((3,"c"))
res45: scala.collection.mutable.ListMap[Int,String] = Map(3 -> c, 1 -> a, 2 -> b)

3.可變映射的添加、更新和刪除元素

1)通過給鍵指定值的方式為可變映射添加元素。

scala> var status = scala.collection.mutable.Map[String,String]()
status: scala.collection.mutable.Map[String,String] = Map()

scala> status("a1") = "a1a"

scala> status
res47: scala.collection.mutable.Map[String,String] = Map(a1 -> a1a)

2)通過+=方法添加一個或者多個元素。

scala> var status = scala.collection.mutable.Map[String,String]()
status: scala.collection.mutable.Map[String,String] = Map()

scala> status += (("a1","a1a"))
res50: status.type = Map(a1 -> a1a)

scala> status
res51: scala.collection.mutable.Map[String,String] = Map(a1 -> a1a)

scala> status += (("a1","a1a"),("a2","a2a"))
res52: status.type = Map(a1 -> a1a, a2 -> a2a)

scala> status
res53: scala.collection.mutable.Map[String,String] = Map(a1 -> a1a, a2 -> a2a)

3)用++=從另一個集合添加多個元素。

scala> var status = scala.collection.mutable.Map[String,String]()
status: scala.collection.mutable.Map[String,String] = Map()

scala> status ++= List(("a1","a1a"),("a2","a2a"))
res55: status.type = Map(a1 -> a1a, a2 -> a2a)

4)用-=的方法通過指定元素的鍵從映射中刪除一個或者多個元素。

scala> status ++= List(("a1","a1a"),("a2","a2a"))
res56: status.type = Map(a1 -> a1a, a2 -> a2a)

scala> status -= "a1"
res57: status.type = Map(a2 -> a2a)

scala> status
res58: scala.collection.mutable.Map[String,String] = Map(a2 -> a2a)

scala> status -= ("a1","a2")
res60: status.type = Map()

scala> status
res61: scala.collection.mutable.Map[String,String] = Map()

5)用--=刪除集合里的指定的元素。

scala> var status = scala.collection.mutable.Map[String,String]()
status: scala.collection.mutable.Map[String,String] = Map()

scala> status ++= List(("a1","a1a"),("a2","a2a"))
res67: status.type = Map(a1 -> a1a, a2 -> a2a)

scala> status --= List("a1","a2")
res68: status.type = Map()

scala> status
res69: scala.collection.mutable.Map[String,String] = Map()

6)通過賦值值給元素的鍵更新元素。

scala> var status = scala.collection.mutable.Map[String,String]()
status: scala.collection.mutable.Map[String,String] = Map()

scala> status ++= List(("a1","a1a"),("a2","a2a"))
res72: status.type = Map(a1 -> a1a, a2 -> a2a)

scala> status("a1") = "hello world"

scala> status
res74: scala.collection.mutable.Map[String,String] = Map(a1 -> hello world, a2 -> a2a)

4.不可變映射的添加、更新和刪除元素

1)用+個方法添加一個或者多個元素,在這個過程中將結果賦給一個新的變量。

scala> val a = Map(("a1","a1a"))
a: scala.collection.immutable.Map[String,String] = Map(a1 -> a1a)

scala> val b = a + (("a2","a2a"))
b: scala.collection.immutable.Map[String,String] = Map(a1 -> a1a, a2 -> a2a)

scala> val c = b + (("a3","a31"),("a4","a4a"))
c: scala.collection.immutable.Map[String,String] = Map(a1 -> a1a, a2 -> a2a, a3 -> a31, a4 -> a4a)

2)更新一個不可變映射的鍵值對,需要用+方法對鍵/值重新賦值,新值替換舊值。

scala> val a = Map(("a1","a1a"))
a: scala.collection.immutable.Map[String,String] = Map(a1 -> a1a)

scala> val b = a + (("a2","a2a"))
b: scala.collection.immutable.Map[String,String] = Map(a1 -> a1a, a2 -> a2a)

scala> val c = b + (("a1","hello world"))
c: scala.collection.immutable.Map[String,String] = Map(a1 -> hello world, a2 -> a2a)

3)使用-方法刪除一個或者多個元素。

scala> val a = Map(("a1","a1a"))
a: scala.collection.immutable.Map[String,String] = Map(a1 -> a1a)

scala> val b = a + (("a2","a2a"),("a3","a3a"),("a4","a4a"))
b: scala.collection.immutable.Map[String,String] = Map(a1 -> a1a, a2 -> a2a, a3
-> a3a, a4 -> a4a)

scala> val c = b - "a1" - "a2"
c: scala.collection.immutable.Map[String,String] = Map(a3 -> a3a, a4 -> a4a)

scala> val d = c - "a4"
d: scala.collection.immutable.Map[String,String] = Map(a3 -> a3a)

當一個不可變的變量聲明為var時,它仍然是一個不可變的映射,不能給映射中的元素重新賦值。

5.映射值的訪問

1)訪問保存在映射中單獨的值,如果鍵不存在,會拋出異常。為了避免這個問題,可以在創建映射時使用withDefaultValue的方法。該方法會創建一個默認值,如果鍵沒有找到,映射會返回這個值。

scala> val status = Map((1,"a"),(2,"b"),(3,"c")).withDefaultValue("Not Found")
status: scala.collection.immutable.Map[Int,String] = Map(1 -> a, 2 -> b, 3 -> c)

scala> status(4)
res5: String = Not Found

scala> status(3)
res6: String = c

2)尋找鍵時可以使用getOrElse方法,當指定的鍵找不到時,會返回默認值。

scala> val status = Map((1,"a"),(2,"b"),(3,"c"))
status: scala.collection.immutable.Map[Int,String] = Map(1 -> a, 2 -> b, 3 -> c)

scala> val s = status.getOrElse(6,"Not such value")
s: String = Not such value

3)可以使用get方法返回Option對象。

scala> val status = Map((1,"a"),(2,"b"),(3,"c"))
status: scala.collection.immutable.Map[Int,String] = Map(1 -> a, 2 -> b, 3 -> c)

scala> val s = status.get(5)
s: Option[String] = None

scala> val s = status.get(2)
s: Option[String] = Some(b)

6.映射的遍歷

1)for循環遍歷所有的映射元素。

scala> val status = Map((1,"a"),(2,"b"),(3,"c"),(4,"d"))
status: scala.collection.immutable.Map[Int,String] = Map(1 -> a, 2 -> b, 3 -> c, 4 -> d)

scala> for((k,v) <- status) println(s"key: $k, value: $v")
key: 1, value: a
key: 2, value: b
key: 3, value: c
key: 4, value: d

2)匹配表達式配合foreach方法。

scala> val status = Map((1,"a"),(2,"b"),(3,"c"),(4,"d"))
status: scala.collection.immutable.Map[Int,String] = Map(1 -> a, 2 -> b, 3 -> c, 4 -> d)

scala> status.foreach{
	 | case(k,v) => println(s"key: $k,value: $v")
	 | }
key: 1,value: a
key: 2,value: b
key: 3,value: c
key: 4,value: d

3)使用Tuple語法訪問鍵/值字段。

scala> val status = Map((1,"a"),(2,"b"),(3,"c"),(4,"d"))
status: scala.collection.immutable.Map[Int,String] = Map(1 -> a, 2 -> b, 3 -> c, 4 -> d)

scala> status.foreach(x => println(s"key: ${x._1},value: ${x._2}"))
key: 1,value: a
key: 2,value: b
key: 3,value: c
key: 4,value: d

4)如果想要映射中所有的鍵,keys方法返回Iterable。

scala> val status = Map((1,"a"),(2,"b"),(3,"c"),(4,"d"))
status: scala.collection.immutable.Map[Int,String] = Map(1 -> a, 2 -> b, 3 -> c, 4 -> d)

scala> status.keys.foreach((key) => println(key))
1
2
3
4

5)如果想要映射中所有的value的值,用values方法可以遍歷映射中所有的值。

scala> val status = Map((1,"a"),(2,"b"),(3,"c"),(4,"d"))
status: scala.collection.immutable.Map[Int,String] = Map(1 -> a, 2 -> b, 3 -> c, 4 -> d)

scala> status.values.foreach((value) => println(value))
a
b
c
d

7.操作映射的值

1)如果要遍歷映射並對每個值進行操作,mapValues是個不錯的選擇。它可以在每個映射值上執行一個函數,然后返回修改后的映射。

scala> var x = collection.mutable.Map((1,"a"),(2,"b"))
x: scala.collection.mutable.Map[Int,String] = Map(2 -> b, 1 -> a)

scala> val y = x.mapValues(_.toUpperCase)
y: scala.collection.Map[Int,String] = Map(2 -> B, 1 -> A)

2)transform方法可以同時使用鍵/值實現一個變換方法。

scala> val map = Map((1,10),(2,20),(3,30))
map: scala.collection.immutable.Map[Int,Int] = Map(1 -> 10, 2 -> 20, 3 -> 30)

scala> val newMap = map.transform((k,v) => k + v)
newMap: scala.collection.immutable.Map[Int,Int] = Map(1 -> 11, 2 -> 22, 3 -> 33)

8.從映射中獲取所有的鍵和值

1)用keySet的方法將以集合的方式獲取所有的鍵。

scala> val status = Map(("a1","a1a"),("a2","a2a"),("a3","a3a"))
status: scala.collection.immutable.Map[String,String] = Map(a1 -> a1a, a2 -> a2a, a3 -> a3a)

scala> status.keySet
res14: scala.collection.immutable.Set[String] = Set(a1, a2, a3)

2)用keys方法獲得一個Iterable。

scala> status.keys
res16: Iterable[String] = Set(a1, a2, a3)

3)用keysIterator方法獲取所有作為迭代器的鍵。

scala> status.keysIterator
res17: Iterator[String] = non-empty iterator

4)使用values方法可以獲取映射中所有的值,並將結果轉化為Iterable對象。

scala> status.values
res18: Iterable[String] = MapLike(a1a, a2a, a3a)

5)使用valuesIterator方法,返回Iterator對象。

scala> status.valuesIterator
res19: Iterator[String] = non-empty iterator

keysIterator和valuesIterator方法都會從映射數據返回一個迭代器。這些方法不會創建一個新的集合,僅僅是提供遍歷已存在的迭代器。

9.反轉鍵值

可以用for推導反轉映射的鍵值,然后將結果賦給一個新的變量。但是映射中,key是不重復的,value是可以重復的,但是在反轉時可能會丟掉數據。

scala> val status = Map(("a1","a1a"),("a2","a2a"),("a3","a3a"))
status: scala.collection.immutable.Map[String,String] = Map(a1 -> a1a, a2 -> a2a, a3 -> a3a)

scala> val newMap = for((k,v) <- status) yield (v,k)
newMap: scala.collection.immutable.Map[String,String] = Map(a1a -> a1, a2a -> a2, a3a -> a3)

10.測試映射中鍵/值的存在

1)用contains方法測試映射中是否包含鍵。

scala> val status = Map(("a1","a1a"),("a2","a2a"),("a3","a3a"))
status: scala.collection.immutable.Map[String,String] = Map(a1 -> a1a, a2 -> a2a, a3 -> a3a)

scala> if (status.contains("a1")) println("found a1") else println("not found")
found a1

scala> if (status.contains("a5")) println("found a5") else println("not found")
not found

2)使用valuesIterator方法搜索值,結合exists和contains。

scala> val status = Map(("a1","a1a"),("a2","a2a"),("a3","a3a"))
status: scala.collection.immutable.Map[String,String] = Map(a1 -> a1a, a2 -> a2a, a3 -> a3a)

scala> status.valuesIterator.exists(_.contains("a2a"))
res22: Boolean = true

scala> status.valuesIterator.exists(_.contains("a2a2"))
res23: Boolean = false

11.根據鍵或者值對映射排序

1)可以用sortBy方法對值(_2)/鍵(_1)從低到高進對映射進行排序。

scala> val grade = Map((1,98),(2,89),(3,88),(4,93),(5,95))
grade: scala.collection.immutable.Map[Int,Int] = Map(5 -> 95, 1 -> 98, 2 -> 89, 3 -> 88, 4 -> 93)

scala> import scala.collection.immutable.ListMap
import scala.collection.immutable.ListMap

scala> ListMap(grade.toSeq.sortBy(_._2):_*)
res25: scala.collection.immutable.ListMap[Int,Int] = Map(3 -> 88, 2 -> 89, 4 -> 93, 5 -> 95, 1 -> 98)

2)可以用sortWith方法對值(_2)/鍵(_1)按照升序或者降序對值進行排序。

//按照值升序:
scala> ListMap(grade.toSeq.sortWith(_._2 < _._2):_*)
res28: scala.collection.immutable.ListMap[Int,Int] = Map(3 -> 88, 2 -> 89, 4 ->93, 5 -> 95, 1 -> 98)
//按照值降序:
scala> ListMap(grade.toSeq.sortWith(_._2 > _._2):_*)
res29: scala.collection.immutable.ListMap[Int,Int] = Map(1 -> 98, 5 -> 95, 4 ->93, 2 -> 89, 3 -> 88)

關於_*:
它的作用是將數據轉換,然后將其作為多個參數傳給ListMap。

12.映射中鍵值的最值

1)對鍵進行排序。

scala> val grade = Map((1,98),(2,89),(3,88),(4,93),(5,95))
grade: scala.collection.immutable.Map[Int,Int] = Map(5 -> 95, 1 -> 98, 2 -3 -> 88, 4 -> 93)

scala> grade.max
res31: (Int, Int) = (5,95)

scala> grade.keysIterator.max
res32: Int = 5

scala> grade.keysIterator.reduceLeft((x,y) => if(x > y) x else y)
res33: Int = 5

2)對值進行排序 。

scala> val grade = Map((1,98),(2,89),(3,88),(4,93),(5,95))
grade: scala.collection.immutable.Map[Int,Int] = Map(5 -> 95, 1 -> 98, 2 -> 89,3 -> 88, 4 -> 93)

scala> grade.valuesIterator.max
res40: Int = 98

scala> grade.valuesIterator.reduceLeft((x,y) => if(x > y) x else y)
res41: Int = 98

scala> grade.valuesIterator.reduceLeft(_ max _)
res42: Int = 98

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM