Scala 映射和元组

摘自《快学Scala》

0.重点

  • Scala 有十分易用的语法来创建,查询和遍历映射
  • 需要从可变和不可变的映射中做出选择
  • 默认情况下,你得到的是一个哈希映射,不过也可以指明要树形映射
  • 可以很容易的在Scala映射和Java映射之间来回切换
  • 元组可以用来聚集值

1.构造映射

// 构造一个不可变的Map[String, Int],其值不能被改变
val scores = Map("Alice"->10, "Bob"->3, "Cindy"->8)

//从空映射开始
val scores = new scala.collection.mutable.HashMap[String, Int]

->操作符用来创建对偶:
"Alice" -> 10
得到("Alice", 10)

val scores = Map(("Alice",10),("Bob",3),("Cindy",8))

2.获取映射中的值

val bobsScore = scores("Bob") //类似Java中的scores.get("Bob")
//如果映射并不包含请求中使用的键,则会抛出异常

//contians方法:
val bobsScore = if(scores.contains("Bob")) scores("Bob") else 0
val bobsScore = scores.getOrElse("Bob",0)
//如果映射包含键"Bob",返回对应的值,否则返回0

3.更新映射中的值

在可变映射中,可以更新某个映射的值,或者添加一个新的映射关系。

scores("Bob") = 10//更新键"Bob"对应的值,假定scores是可变的
scores("Fred") = 7 //增加新的key/value到scores,假定scores是可变的

+= 操作来添加多个关系:
scores += ("Bob"->10, "Fred"->7)

-= 操作来移除某个键和对应的值:
scores -= "Alice"

//对不可变映射来说,可以获取一个包含所需要的更新的新映射
val newScore = scores + ("Bob"->10, "Fred"->7) //更新过的新映射
//newScore映射包含了与scores相同的映射关系,此外"Bob"被更新,"Fred"被添加进来

//还可以更新var变量
var scores = ...
scores = scores + ("Bob"->10, "Fred"->7)
scores = scores - "Alice"

4.迭代映射

for((k,v) <- 映射) 处理 k 和 v

//只需访问键或值:
scores.keySet   //一个类似Set("Bob","Cindy","Fred","Alice")这样的集合

for(v <- scores.values) println(v) 

翻转一个映射——交换键和值的位置:
for((k,v) <- 映射) yield(v,k)

5.已排序映射

操作映射时,须要选定一个实现——一个哈希表或者一个平衡树。默认情况下,Scala给的是哈希表。由于对使用的键没有很好的哈希函数,或者需要顺序的访问所有的键,因此你可能会想要一个树形映射。

// 得到一个不可变的树形映射而不是哈希映射
val scores = scala.collection.immutable.SortedMap(
"Slice" -> 10,
"Fred" -> 7,
"Bob" -> 3,
"Cindy" -> 8
)

//如果要按插入顺序访问所有键,使用LinkedHashMap,如:
val months = scala.collection.mutable.LinkedHashMap(
"January" -> 1,
"February"->2,
"March"->3,
...
)

6.与Java的互操作

7.元组

映射是键/值对偶的集合。对偶是元组(tuple)的最简单形态——元组是不同类型的值的聚集

如:

(1,3.14,"Fred")//一个元组,类型为Tuple3[Int, Double, java.lang.String]

//类型定义也可以写为:
(Int,Double,java.lang.String)

val t = (1,3.14,"Fred")
val second = t._2 //将second设为3.14

和数组或字符串中的位置不同,元组的各组员从1开始,而不是0

8.拉链操作

使用元组的原因之一是把多个值绑在一起,以便它们能够被一起处理,这通常可以用zip方法来完成。

val symbols = Array("<","-",">")
val counts = Array(2, 10, 2)
val pairs = symbols.zip(counts)
//输出对偶的数组:Array(("<",2), ("-",10), (">",2))
//然后这些对偶就可以一起处理:
for((s,n)<- pairs) Console.print(s * n)  //会打印<<---------->>

用toMap方法可以将对偶的集合转换成映射。
如果你有一个键的集合,以及一个与之平行对应的值的集合,那么就可以用拉链操作将它们组合成一个映射。

keys.zip(values).toMap
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值