Scala學習八:Map, Tuple
Map集合
Scala中的集合 一般情況 下都分爲 可變集合 和 不可變集合。
可變集合:
scala.collection.mutable._
可以改變集合的大小及元素內容。對集合的修改操作都是在原集合上進行的。不可變集合:
scala.collection.immutable._
不能改變集合大小及元素內容。對集合的修改操作都會生成一個新的數據集。集合中的元素都是對偶,或者說都是 二元元組
常用的集合操作:
// 獲取一個Key的Set集合
val keys = map.keySet
// 獲取一個Iterable集合
val valItr = map.values
val isEmpty = map.isEmpty
Scala 不可變集合
import scala.collection.immutable.{HashMap,Map}
println("------- Map [init] ")
// 通過初始值構造
val m = Map(("a"->1),("b",2))
// 構造一個空集合
val map = new HashMap[String, Int]
// 有2種方式向集合中的添加元素
map.+(("a", 1))
map.+(("b" -> 2))
// 數據爲空,因爲每次操作都產生新的數據集合
println(" map.get(a) = " + map.get("a"))
println(" map.get(b) = " + map.get("b"))
// get 操作產生一個Option對象,並不是真正的Key值,當未找到Key時,返回None
println(" map.get(c) = " + map.get("c"))
// 直接獲取Key所對應的值,未找到Key時,返回 NoSuchElementException 異常
println(" map.get(c) = " + map("c"))
// 當不確定元素是否在在集合中時,可以通過getOrElse來賦於默認值,防止程序出現異常
println(" map.getOrElse = " + map.getOrElse("c",0))
println(" map.all = " + map)
Scala 可變集合
import scala.collection.mutable.{HashMap,Map}
println("------- Map [init] ")
// 通過初始值構造
val m = Map(("a"->1),("b",2))
// 構造一個空集合
val map = new HashMap[String, Int]
// 有2種方式向集合中的添加元素
// 注意方法調用不一樣,不可變集合的map沒有 += 方法
map.+=(("a", 1))
map.+=(("b" -> 2))
// 數據爲空,因爲每次操作都產生新的數據集合
println(" map.get(a) = " + map.get("a"))
println(" map.get(b) = " + map.get("b"))
// get 操作產生一個Option對象,並不是真正的Key值,當未找到Key時,返回None
println(" map.get(c) = " + map.get("c"))
// 直接獲取Key所對應的值,未找到Key時,返回 NoSuchElementException 異常
println(" map.get(c) = " + map("c"))
// 當不確定元素是否在在集合中時,可以通過getOrElse來賦於默認值,防止程序出現異常
println(" map.getOrElse = " + map.getOrElse("c",0))
println(" map.all = " + map)
Scala中的Map集合迭代非常方便,因爲你可以使用模式匹配。
對集合的迭代在
for ((k, v) <- map) {
println("key = " + k + ", value = " + v)
}
Tuple元組
元組是不同類型的值的集合。集合中的鍵-值映射是元組的最簡單形式。元組是將多個值用逗號分隔,並通過 “小括號()” 包含形成的。
通過IDE提示看到元組最大支持到22位。
可以通過 “_.N” 來訪問 元組中的值,與其他集合不同,元組下標從 1 開始。也可以寫成 “t空格_2”,但不能寫能 “t_2”
將元組中的值反解時,可以通過模式匹配將 元組中多個值賦於 變量,如果只需要 前N個,後面用 “(下劃線)_” 省略。
println("------- Tuple [init] ")
val tupA = ("a", 1)
val tupB = ("b" -> 2)
val tupC = "c" -> 3
val tupD = new Tuple3[String, String, String]("a", "b", "c")
// 元組中的值下標從1開始
println(" tupD._3 = " + tupD._3)
// 反解元組中的值,可以用模式匹配
// _ 表示省略後面的值
val (first, second ,_) = tupD
println(" first = " + first)
println(" second = " + second)
// zip方法可以將 相同個數的 集合轉換成對偶集合
val keys = Array("a","b","c")
val values = Array(1,2,3)
// pairs 類型是 Array((String,Int))
val pairs = keys.zip(values)
println(" pairs = " + pairs.mkString("\t"))
// toMap 方法 可以將對偶集合轉換成 Map
// 注意:isInstanceOf[Class] 中的 Class 中的泛型信息別丟掉,可能會報錯
val map = pairs.toMap
println(" is Map = " + map.isInstanceOf[scala.collection.immutable.Map[String,Int]])