0
点赞
收藏
分享

微信扫一扫

ScalaNote17-集合之映射Map

Star英 2022-08-04 阅读 33


映射Map

  Scala中的Map是一个散列表,它存储的内容也是键值对(key-value)映射,Scala中不可变的Map是有序的,可变的Map是无序的。Scala中,有可变Map (scala.collection.mutable.Map) 和 不可变Map(scala.collection.immutable.Map)。

// 构造不可变映射
val map1 = Map("Alice" -> 10, "Bob" -> 20, "Kotlin" -> "BeiJing")
println("map1 = "+ map1)
// 构造可变映射
val map2 = scala.collection.mutable.Map("Alice" -> 10, "Bob" -> 20, "Kotlin" -> "BeiJing")
println("map2 = "+ map2)
// 创建空的映射
val map3 = new scala.collection.mutable.HashMap[String, Int]
println("map3 = "+ map3)
// 对偶元组
// 即创建包含键值对的二元组, 和第一种方式等价,只是形式上不同而已。
// 对偶元组 就是只含有两个数据的元组
val map4 = scala.collection.mutable.Map( ("A", 1), ("B", 2), ("C", 3),("D", 30) )
println("map4=" + map4)

map1 = Map(Alice -> 10, Bob -> 20, Kotlin -> BeiJing)
map2 = Map(Bob -> 20, Kotlin -> BeiJing, Alice -> 10)
map3 = Map()
map4=Map(D -> 30, A -> 1, C -> 3, B -> 2)





map1: scala.collection.immutable.Map[String,Any] = Map(Alice -> 10, Bob -> 20, Kotlin -> BeiJing)
map2: scala.collection.mutable.Map[String,Any] = Map(Bob -> 20, Kotlin -> BeiJing, Alice -> 10)
map3: scala.collection.mutable.HashMap[String,Int] = Map()
map4: scala.collection.mutable.Map[String,Int] = Map(D -> 30, A -> 1, C -> 3, B -> 2)

  • 不可变映射输出顺序和声明顺序一致
  • 可变映射输出顺序和声明顺序一致
  • 构建映射的方式,可以是(“Alice” -> 10),也可以是(“Alice”,10)

映射取值

// ---- 方式一
// 如果key存在,则返回对应的值
// 如果key不存在,则抛出异常[java.util.NoSuchElementException]
val map4 = scala.collection.mutable.Map( ("A", 1), ("B", 2), ("C", 3),("D", 30) )
println("map4(\"A\") = "+ map4("A"))
// ---- 方式二
// key不存在会抛异常,contains判断key是否存在
if( map4.contains("B") ){map4("B")}
// ---- 方式三
// key不存在会抛异常
println("map4.get(\"A\").get = " + map4.get("A").get)
// ---- 方式四
// 如果key存在,返回key对应的值
// 如果key不存在,返回默认值
println("map4.getOrElse(\"A\",\"default\") = " + map4.getOrElse("A","default"))

map4("A") = 1
map4.get("A").get = 1
map4.getOrElse("A","default") = 1





map4: scala.collection.mutable.Map[String,Int] = Map(D -> 30, A -> 1, C -> 3, B -> 2)

取个元素操作这么多,这里直接引用韩老师的总结吧~

  • 如果我们确定map有这个key ,则应当使用map(key), 速度快
  • 如果我们不能确定map是否有key ,而且有不同的业务逻辑,使用map.contains() 先判断在加入逻辑
  • 如果只是简单的希望得到一个值,使用map4.getOrElse(“ip”,“127.0.0.1”)

元素的修改、增加、删除
修改元素指修改对应key的元素值,增加元素指增加对应key-value键值对

println("--------------- Modify val ---------------")
val map1 = scala.collection.mutable.Map(("A", 1), ("B", 2), ("C", 3),("D", 30))
// 如果key存在,直接修改该key对应的元素值
map1("A") = 10
// 如果key不存在,相当于新增
map1("E") = 11
println("map1 = "+ map1)
println("--------------- Add key-val ---------------")
// 增加键值对
map1 += ( "F" -> 5 )
map1 += ( ("F",5),("G",6 ))// 增加多个key-val
map1 += ( "A" -> 100 )// 如果key存在相当于修改元素值
println("map1 = "+ map1)
println("--------------- Remove key-val ---------------")
// 删除对应的key-val,有就删除,没有也不报错(如AA)
map1 -= ("A", "B", "AA")
println("map1 = "+ map1)

--------------- Modify val ---------------
map1 = Map(D -> 30, A -> 10, C -> 3, E -> 11, B -> 2)
--------------- Add key-val ---------------
map1 = Map(D -> 30, G -> 6, A -> 100, C -> 3, F -> 5, E -> 11, B -> 2)
--------------- Remove key-val ---------------
map1 = Map(D -> 30, G -> 6, C -> 3, F -> 5, E -> 11)





map1: scala.collection.mutable.Map[String,Int] = Map(D -> 30, G -> 6, C -> 3, F -> 5, E -> 11)

  • 只有可变映射可以进行元素修改和删减
  • +=增加元素
  • -=删除元素,没有对应的key也不报错

Map遍历
遍历没啥好说的,直接看用法吧

println("map1 = "+map1)
println("map1.keys = "+map1.keys)
println("map1.values = "+map1.values)
// map1.foreach((key,value)=>println(key,value))
map1.foreach((key)=>println(key))
for ((key,value) <- map1){
printf("key = %s ; value = %s\n",key,value)
}

map1 = Map(D -> 30, G -> 6, C -> 3, F -> 5, E -> 11)
map1.keys = Set(D, G, C, F, E)
map1.values = HashMap(30, 6, 3, 5, 11)
(D,30)
(G,6)
(C,3)
(F,5)
(E,11)
key = D ; value = 30
key = G ; value = 6
key = C ; value = 3
key = F ; value = 5
key = E ; value = 11

Set

  Set是不重复元素的集合。集不保留顺序,默认是以哈希集实现。Set也有可变和不可变的,创建可变Set,需要引入​​import scala.collection.mutable.Set​​。看个Demo :

val set1 = Set(1, 2, 3) //不可变
val set2 = scala.collection.mutable.Set(2,3,4) //可变
println("set1 = " + set1)
println("set2 = " + set2)

set1 = Set(1, 2, 3)
set2 = Set(2, 3, 4)





set1: scala.collection.immutable.Set[Int] = Set(1, 2, 3)
set2: scala.collection.mutable.Set[Int] = Set(2, 3, 4)

Set元素的增、删

println("----------- Add Item -----------")
set2.add(4) //方式1
set2.add(5) //方式1
set2 += 6 //方式2
set2.+=(7) //方式3
println("set2 = " + set2)
println("----------- Remove Item -----------")
set2.remove(4)
set2 -= 7 // 删除的一种方式
set2.remove(999)
println("set2 = " + set2)

----------- Add Item -----------
set2 = Set(5, 2, 6, 3, 7, 4)
----------- Remove Item -----------
set2 = Set(5, 2, 6, 3)

  • 增加元素的方式真多,麻烦的~如果元素存在不添加亦不报错
  • 删除元素和之前Array和List根据索引删除不同,Set可以直接删除值,并且值没有也不报错

Set的其他操作

// 新建 
val set1 = scala.collection.mutable.Set(1,2,3)
val set2 = scala.collection.mutable.Set(2,3,4)
// 遍历
set1.foreach((i=>print(i+",")))
// 交集
println()
println("Intersection(set1,set2) = " + (set1&set2))
// 并集
println("Union(set1,set2) = " + (set1++set2))
// 最大值、最小值
printf("\nset1.max = %d ,set1.min = %d",set1.max,set1.min)

1,2,3,
Intersection(set1,set2) = Set(2, 3)
Union(set1,set2) = Set(1, 2, 3, 4)

set1.max = 3 ,set1.min = 1




set1: scala.collection.mutable.Set[Int] = Set(1, 2, 3)
set2: scala.collection.mutable.Set[Int] = Set(2, 3, 4)

集合的其他操作可以看文档https://www.scala-lang.org/api/current/scala/collection/immutable/HashMap.html

                                2020-03-12 于南京市栖霞区


举报

相关推荐

0 条评论