scala之Map

一、概念

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章节

 

 

 

 

 

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值