一個經典的程式猿名言是:”如果只能有一種數據結構,那就用哈希表吧。“ ...
Map(映射)是一種可迭代的鍵值對集合。在scala中使用映射非常簡單。
構造Map
//inmutable Map(不可變映射,值不可變)
// 具有初始值
// 在scala中->操作符是用來創建鍵值對元組的。
val inmutableMap = Map(("yoleen" -> 20), ("hq", 26))
// 不具有初始值,不建議對不可變Map這樣構建。不可變映射添加數據都返回一個新的映射。
val stringToInt = new scala.collection.immutable.HashMap[String, Int]
//mutable Map(可變映射,增加、刪除、更新元素返回自身)
val mutableMap: mutable.Map[String, Int] = scala.collection.mutable.Map(("yoleen" -> 20), ("hq", 26))
//不具有初始值
val stringToInt = new scala.collection.mutable.HashMap[String, Int]
//有初始值的可以不用new
獲取映射中的值
val mutableMap: mutable.Map[String, Int] = scala.collection.mutable.Map(("yoleen" -> 20), ("hq", 26))
val v: Option[Int] = mutableMap.get("yoleen") //如果key存在返回的是some對象,對結果進行了封裝。不存在返回的是None
val v1: Int = mutableMap("yoleen")// 使用apply方法獲取值,不進行option封裝。
val v2: Int = mutableMap.getOrElse("yoleen", 10)//如果key不存在就返回預設值
val v3: Int = mutableMap.getOrElseUpdate("yoleen1",op(5,6))//如果key不存在返回預設值的同時還添加進映射中去。
添加&更新映射中的值
val mutableMap: mutable.Map[String, Int] = scala.collection.mutable.HashMap[String,Int]
mutableMap+=("yoleen"->10)
mutableMap+=("yoletpig"->10,"alex"->20) //添加多個鍵值對
mutableMap++=mutable.Map(("tony" -> 20), ("jskon", 26)) //添加另一個映射中所有鍵值對。
mutableMap.put("kudu",6)//鍵存在則更新值
mutableMap("yoleen") = 20//更新值
mutableMap.transform((s, i) => i * 2)//對每個鍵對應的值進行*2操作
移除鍵值對
mutableMap-="yoleen"
mutableMap-=("yoletpig","jskon") //移除多個鍵值對
val option: Option[Int] = mutableMap.remove("kudu") //移除鍵值對返回option對象
mutableMap.retain((s,i)=>s.startsWith("y") && i>=10) //只保留鍵已"y"開頭並且值大於等於10的鍵值對
mutableMap.clear()//清除所有鍵值對
迭代映射
for (elem <- mutableMap) {
elem // tuple類型(String,Int)
}
for ((k,v) <- mutableMap) {
//k,v 鍵跟值
}
for (elem <- mutableMap.keySet) {
//elem 就是key
}
for (elem <- mutableMap.values) {
//elem 就是value
}
其他映射
除了常用的HashMap之外,還有SortMap,LinkedHashMap,TreeMap等等。
- SortMap 按照順序依次訪問映射中的鍵。
- LinkedHashMap 按照插入順序訪問。
- TreeMap 按鍵排序。
如需與java互操作,加入隱式轉換就行。
import scala.collection.JavaConversions.mapAsScalaMap
元組(Tuple)
元組的值是通過將單個的值包含在()中構成。例如:
(1,3.14,"hello") //類型不限
val t = (1,3.14,"hello")
//我們可以通過._1 ._2來訪問元組中的元素
val a = t._1 // 1
val b = t._2 // 3.14
//註意,元組下標是從1開始。
//我們可以使用模式匹配獲取元組中的值。
val (first,_,third) = t
// first=1,third="hello"
元組的拉鏈操作
val sy = Array("<","-",">")
val cnt = Array(2,3,2)
val pairs = sy.zip(cnt) //Array(("<",2),("-",3),(">",2))
for((s,n)<-pairs) print(s*n) // <<--->>