一、Map
### --- Map
~~~ Map(映射)是一系列键值对的容器;Scala 提供了可变的和不可变的两种版本的Map,
~~~ 分别定义在包 scala.collection.mutable 和 scala.collection.immutable 里;
~~~ 默认情况下,Scala中使用不可变的 Map;
~~~ 如果要使用可变Map,必须导入scala.collection.mutable.Map;
~~~ 在Map中,键的值是唯一的,可以根据键来对值进行快速的检索。
### --- 编程示例
// 可使用两种方式定义Map
// Map缺省是不可变的,值不能更改
val a = Map("a" -> 1, "b" -> 2, "c" -> 3)
val a = Map(("a", 1),("b", 2),("c", 3))
a.keys
a.values
// 获取Map中的值:
a("a")
// 访问不存在的key时,会抛出异常。Java.util.NoSuchElementException: key not found: x
a("x")
// 使用get方法,返回一个Option对象,要么是Some(键对应的值),要么是None
a.get("a")
// 获取键对应的值,如果键不存在返回给定的值(这里是0)
a.getOrElse("a", 0)
// 更新Map中的值(要使用可变的Map)
val b = scala.collection.mutable.Map("a" -> 1, "b" -> 2, "c" -> 3)
b("a") = 2
// 增加了一个新元素
b("d") = 4
// 用 + 添加新的元素;用 – 删除元素
b += ("e" -> 1, "f" -> 2)
b -= "a"
// 增加元素
val b = Map("a" -> 1, "b" -> 2, "c" -> 3)
val c = b + ("a" -> 10, "b" -> 20)
// 通过包含键值对的二元组创建Map集合
val a = Map(("a", 1),("b", 2),("c", 3))
// 逐个访问 value
for(v <- a.values) println(v)
// key 和 value 做了交换
val b = for((k,v) <- a) yield (v,k)
// 下面才是具有scala风格的写法,推荐
a.map(x=>(x._2, x._1))
// 拉链操作创建Map
val a = Array(1,2,3)
val b = Array("a","b","c")
//c: Array[(Int, String)]
val c = a.zip(b)
//c: scala.collection.immutable.Map[Int,String]
val c = a.zip(b).toMap
二、编程实现
### --- 编程代码
package yanqi.cn.part09
import scala.collection.mutable
object MapDemo {
def main(args: Array[String]): Unit = {
//使用两种方式定义Map
val map1 = Map("a" -> 1, "b" -> 2)
val map2 = Map(("a", 1), ("b", 2))
map1.keys.foreach(println(_))
map1.values.foreach(println(_))
//如果访问不存在的Key值时,会抛出异常
// println(map1("c"))
//也可以使用get方法,来获取与Key值相对应的Value值。
//get方法会返回一个Option对象,要么要是Some(有值),要么是None(无值)
val num: Option[Int] = map1.get("c")
num match {
case None => println("None")
case Some(x) => println(x)
}
//获取Key值所对应的Value值,如果键Key不存在,那么就返回指定的默认值
val num2: Int = map1.getOrElse("d", 0)
println(num2)
//创建一个可变的Map
val map3 = scala.collection.mutable.Map("a" -> 1, "b" -> 2)
println(map3)
map3("a") = 10
println(map3)
//增加一个元素
map3("c") = 3
println(map3)
//通过+=添加元素,-=删除元素
map3 += ("d" -> 4, "f" -> 5)
println(map3)
map3 -= "d"
println(map3)
//将Key与Value的值互换
val kv: mutable.Map[Int, String] = for ((k, v) <- map3) yield (v, k)
println(kv)
//推荐使用下面的方式将Key与value的值互换
map3.map(x=>(x._2,x._1)).foreach(println(_))
//通过拉链操作创建Map
val a=Array(1,2,3)
val b=Array("a","b","c")
val c: Array[(Int, String)] = a.zip(b)
val d: Map[Int, String] = a.zip(b).toMap
println(d)
}
}
### --- 编译打印
D:\JAVA\jdk1.8.0_231\bin\java.exe "-javaagent:D:\IntelliJIDEA\IntelliJ IDEA 2019.3.3\lib\idea_rt.jar=60353:D:\IntelliJIDEA\IntelliJ IDEA 2019.3.3\bin" -Dfile.encoding=UTF-8 -classpath D:\JAVA\jdk1.8.0_231\jre\lib\charsets.jar;D:\JAVA\jdk1.8.0_231\jre\lib\deploy.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\access-bridge-64.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\cldrdata.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\dnsns.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\jaccess.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\jfxrt.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\localedata.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\nashorn.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\sunec.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\sunjce_provider.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\sunmscapi.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\sunpkcs11.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\zipfs.jar;D:\JAVA\jdk1.8.0_231\jre\lib\javaws.jar;D:\JAVA\jdk1.8.0_231\jre\lib\jce.jar;D:\JAVA\jdk1.8.0_231\jre\lib\jfr.jar;D:\JAVA\jdk1.8.0_231\jre\lib\jfxswt.jar;D:\JAVA\jdk1.8.0_231\jre\lib\jsse.jar;D:\JAVA\jdk1.8.0_231\jre\lib\management-agent.jar;D:\JAVA\jdk1.8.0_231\jre\lib\plugin.jar;D:\JAVA\jdk1.8.0_231\jre\lib\resources.jar;D:\JAVA\jdk1.8.0_231\jre\lib\rt.jar;E:\NO.Z.10000——javaproject\NO.Z.00002.Hadoop\ScalaPro\out\production\ScalaPro;D:\JAVA\scala-2.12.2\lib\scala-library.jar;D:\JAVA\scala-2.12.2\lib\scala-reflect.jar yanqi.cn.part09.MapDemo
a
b
1
2
None
0
Map(b -> 2, a -> 1)
Map(b -> 2, a -> 10)
Map(b -> 2, a -> 10, c -> 3)
Map(b -> 2, d -> 4, a -> 10, c -> 3, f -> 5)
Map(b -> 2, a -> 10, c -> 3, f -> 5)
Map(2 -> b, 5 -> f, 10 -> a, 3 -> c)
(2,b)
(5,f)
(10,a)
(3,c)
Map(1 -> a, 2 -> b, 3 -> c)
Process finished with exit code 0