【Scala】映射、元组、拉链(Map、Tuple、zip)

映射和元组

在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))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值