映射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 于南京市栖霞区