映射和元组
在Scala中,把哈希表这种数据结构叫做映射。
1.构建映射
1.1构建映射的格式
(1)val map=Map(键 ->值,键 ->值……)
(2)利用元组构建 val map=Map((键 ,值),(键 ,值),(键 ,值……))
scala> val scores=Map("bob"->79,"tom"->81,"carr"->92)
scores: scala.collection.immutable.Map[String,Int] = Map(bob -> 79, tom -> 81, carr -> 92)
scala> val m2=Map(("guanyu",(90,21)))
scala> val scores1=Map(("bob",79),("tom",79),("carr",79))
scores1: scala.collection.immutable.Map[String,Int] = Map(bob -> 79, tom -> 79, carr -> 79)
//可以直接打印
scala> println(m1)
Map(liubei -> 90, guanyu -> 89, zhangfei -> 88)
1.2获取和修改映射中的值
(1)获取映射中的值:
值=map(键)
scala> scores
res6: scala.collection.immutable.Map[String,Int] = Map(bob -> 79, tom -> 81, carr -> 92)
scala> scores("bob")
res7: Int = 79
好用的getOrElse
a> scores
res8: scala.collection.immutable.Map[String,Int] = Map(bob -> 79, tom -> 81, carr -> 92)
scala> scores.getOrElse("bob",0)
res9: Int = 79
//如果映射中有值的话,返回映射中的值,没有就返回默认
注意:Scala中有两种类型的Map,一个是immutable包下的,该Map中的内容不可变;另外一个是mutable包下的Map,该包下的Map内容可变。
例子:
import scala.collection.mutable.Map
scala> scores
res10: scala.collection.immutable.Map[String,Int] = Map(bob -> 79, tom -> 81, carr -> 92)
scala> scores("bob")=88
<console>:14: error: value update is not a member of scala.collection.immutable.Map[String,Int]
scores("bob")=88
//修改报错,重新定义一个
scala> val score1=Map(("liubei",88),("guanyu",89),("zhangfei",90))
score1: scala.collection.mutable.Map[String,Int] = Map(guanyu -> 89, liubei -> 88, zhangfei -> 90)
//修改刘备的成绩
scala> score1("liubei")=95
scala> score1
res16: scala.collection.mutable.Map[String,Int] = Map(guanyu -> 89, liubei -> 95, zhangfei -> 90)
//追加其余的5虎上将成绩
scala> score1 +=("huanggai"->87,"zhaoyun"->91)
res17: score1.type = Map(zhaoyun -> 91, huanggai -> 87, guanyu -> 89, liubei -> 95, zhangfei -> 90)
注意:通常我们再创建一个集合是会用val这个关键字修饰一个变量(相当于java的final),那么就意味着该变量的应用不可变,该引用中的内容是不是可变,取决于这个引用指向的集合的类型。
2.元组
元组是一个固定数量的组合,本体可以作为一个参数传递 元组可以容纳不通过类型的数据,它是不可变的。
2.1创建元组
元组表示通过将不同的值用小括号括起来,即表示元组。
创建元组的格式:
val tuple=(元素,元素……)
scala> val t = ("hadoop",3.14,65535)
t: (String, Double, Int) = (hadoop,3.14,65535)
scala> val t1= ("scala",("bigdata",3.12),21)
t1: (String, (String, Double), Int) = (scala,(bigdata,3.12),21)
定义元组时用小括号将多个元素包裹起来,元素之间用逗号分隔,元素的类型可以不一样,元素的个数可以任意多个。
2.2获取元组中的值
(1)获取元组中值得格式:
使用下划线加脚标,例如,t._3
scala> t
res21: (String, Double, Int) = (hadoop,3.14,65535)
scala> t._2
res23: Double = 3.14
scala> t.toString
res24: String = (hadoop,3.14,65535)
//元组元素的脚标是从1开始的
2.3将对偶的集合转化成映射
将对偶的集合转换成映射:
调用toMap的方法
scala> val arr =Array(("wangan",87),("tianci",88))
arr: Array[(String, Int)] = Array((wangan,87), (tianci,88))
scala> arr.toMap
res27: scala.collection.immutable.Map[String,Int] = Map(wangan -> 87, tianci -> 88)
2.4拉链操作
(1)使用zip命令可以将多个值绑定在一起
scala> val name=Array("liubei","guanyu","zhangfei")
name: Array[String] = Array(liubei, guanyu, zhangfei)
scala> val scores=Array(79,81,93)
scores: Array[Int] = Array(79, 81, 93)
scala> val m4=arr.zip(scores).toMap
m4: scala.collection.immutable.Map[String,Int] = HashMap(zhangfei -> 89, zhaoyun
-> 95, huangzhong -> 89, machao -> 87, guanyu -> 90)
scala> val result = name.zip(scores)
result: Array[(String, Int)] = Array((liubei,79), (guanyu,81), (zhangfei,93))
注意:如果两个数组元素不一致,拉链操作后生成的数组的长度为较小那个数组的元素个数。
(2)如果其中一个元素的个数比较少,可以使用zipAll用默认元素填充。
scala> name
res48: Array[String] = Array(liubei, guanyu, zhangfei)
scala> scores
res49: Array[Int] = Array(78, 81, 85, 90, 91)
scala> name.zipAll(scores,"zhaoyun","huanggai")
res50: Array[(String, Any)] = Array((liubei,78), (guanyu,81), (zhangfei,85), (zhaoyun,90), (zhaoyun,91))