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]])