一、概念
Map是一个散列表,键值对存储方式,也分为 可 变 Map (scala.collection.mutable.Map) 和 不 可 变 Map(scala.collection.immutable.Map),其中不可变的是有序的,可变的是无序的;
二、Map构建
1. 默认是不可变的,.key-value 类型支持 Any
object Test04_Map {
def main(args: Array[String]): Unit = {
//不可变 Map 是有序,构建 Map 中的元素底层是 Tuple2 类型
val map1 = Map("tom" -> 10, "kitty" -> 20, "baby" -> "旺旺")
val map2 = Map("st1" -> "amy")
println(map1)
println(map2)
}
}
运行结果:
Map(tom -> 10, kitty -> 20, baby -> 旺旺)
Map(st1 -> amy)
2. 可变Map创建
println("--------可变----------")
val map3 = mutable.Map("tom" -> 10, "kitty" -> 20, "baby" -> "旺旺")
println(map3)
结果:
--------可变----------
Map(baby -> 旺旺, tom -> 10, kitty -> 20)
3. 空Map创建
println("--------空Map----------")
val map4 = new scala.collection.mutable.HashMap[String, Int]
println(map4)
运行结果
--------空Map----------
Map()
4. 对偶元组创建Map,和第一种方式一样,只是形式不同
println("--------对偶元组创建----------")
val map5 = mutable.Map(("tom" , 10), ("kitty" , 20), ("baby" , "旺旺"))
println(map5)
结果:
--------对偶元组创建----------
Map(baby -> 旺旺, tom -> 10, kitty -> 20)
三、Map操作
1 :map(key)
println("--------map(key)----------")
val map6 = Map("tom" -> 10, "kitty" -> 20, "baby" -> "旺旺")
val value1 = map6("tom")
println(value1)
结果:
--------map(key)----------
10
注:key 不存在,则抛出异常[java.util.NoSuchElementException]
Exception in thread "main" java.util.NoSuchElementException: key not found: tom111
at scala.collection.MapLike$class.default(MapLike.scala:228)
at scala.collection.AbstractMap.default(Map.scala:58)
at scala.collection.MapLike$class.apply(MapLike.scala:141)
at scala.collection.AbstractMap.apply(Map.scala:58)
2.使用 containts 先判断再取值,可以防止异常
println("--------contains 方法检查是否存在 key----------")
if (map6.contains("tom")) {
println("key 存在,值=" + map6("tom"))
} else {
println("key 不存在:)")
}
结果:
--------contains 方法检查是否存在 key----------
key 存在,值=10
3.map.get(key).get 取值
映射.get(键) 这样的调用返回一个 Option 对象,要么是 Some,要么是 None
map.get(key).get 如果key 存 在,返 回 key 对 应 的 值 , 否 则 , 抛 出 异 常java.util.NoSuchElementException: None.get
println("--------map.get(key).get----------")
println(map6.get("tom"))
println(map6.get("tom").get)
println(map6.get("tom123").get)
结果:
--------map.get(key).get----------
Some(10)
10
Exception in thread "main" java.util.NoSuchElementException: None.get
at scala.None$.get(Option.scala:313)
at scala.None$.get(Option.scala:311)
4. map4.getOrElse()
println("--------map.getOrElse----------")
println(map6.getOrElse("Alice~~~","默认的值"))
println(map6.getOrElse("tom","默认的值"))
结果:
--------map.getOrElse----------
默认的值
10
以上4种方法总结:
如果确定key存在使用map(key),如果不确定则先判断containts,如果希望结果都有一个数返回则采用map4.getOrElse()。
四、map 修改、添加和删除
修改,新增
println("--------map新增----------")
//map 是可变的,才能修改,否则报错
// key 存在:则修改对应的值,key 不存在,等价于添加一个 key-val
val map7 = mutable.Map(("A", 0), ("B", "BB"), ("C", 1))
map7("A") = 20 //修改
map7("D") = 2 //新增
map7 += ("F" -> 5)
println("map7=" + map7)
结果:
--------map新增----------
map7=Map(D -> 2, A -> 20, C -> 1, F -> 5, B -> BB)
多个元素增加,如果 key 存在就是更新,如果不存在,这是添加
println("--------map新增多个元素----------")
val map8 = mutable.Map(("A", 0), ("B", "BB"), ("C", 1))
map8 += ("F" -> 5, "G" -> 6)
val map9 = map8 + ("F" -> 5, "G" -> 6)
println("map8:" + map8)
println("map9:" + map9)
结果
--------map新增多个元素----------
map8:Map(G -> 6, A -> 0, C -> 1, F -> 5, B -> BB)
map9:Map(G -> 6, A -> 0, C -> 1, F -> 5, B -> BB)
注:map8 + ("F" -> 5, "G" -> 6)这个方法会新建一个Map
删除元素,key 存在,就删除,如果 key 不存在,也不会报错
println("--------map删除元素----------")
val map10 = mutable.Map(("A", 0), ("B", "BB"), ("C", 1))
map10 -= ("A")
println("map10:" + map10)
结果:
--------map删除元素----------
map10:Map(C -> 1, B -> BB)
五、map 遍历
遍历返回的元素是 Tuple2,
rintln("--------map遍历----------")
val map11 = mutable.Map(("A", 0), ("B", "BB"), ("C", 1))
for (elem <- map11) {
println(elem+"key:"+elem._1+",value:"+elem._2)
}
println("--------map遍历key value----------")
for ((k, v) <- map11) {
println("key:" + k + ",value:" + v)
}
println("--------map遍历value----------")
for (v <- map11.values) {
println(v)
}
println("--------map遍历key----------")
for (elem <- map11.keys) {
println("elem:" +elem)
}
结果:
--------map遍历----------
(A,0)key:A,value:0
(C,1)key:C,value:1
(B,BB)key:B,value:BB
--------map遍历key value----------
key:A,value:0
key:C,value:1
key:B,value:BB
--------map遍历value----------
0
1
BB
--------map遍历key----------
elem:A
elem:C
elem:B
六、项目
不可变map添加元素
var data: Map[String, Any] = Map()
data = data.+(TravelAttrParseFields.vin.toString -> vin)
data = data.+(TravelAttrParseFields.collecttime.toString -> dataArray(1))
请查看list章节