快学Scala 第四章 映射和元组

本文介绍了Scala中映射(哈希表)的构造、值的获取与更新、迭代、排序以及拉链操作,重点讲解了如何在scala collections中使用不可变和可变映射,以及如何处理元组和键值对的增删改查。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

映射(哈希表)是键值对偶的集合。
元组:n个对象的聚集
(n1,n2,n3…)
(m1,m2,m3)
这就是元组,而对偶不过是一个n=2的元组。

4.1 构造映射

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

上面的映射是不可变的。如果要可变的需要使用下面的方法:

val scores = new scale.Collection.mutable.Map("Alice" -> 10, "Bob" -> 3,"Cindy" -> 8)

还可以这样写

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

4.2 获取映射中的值

val bobsScore = if (scores.contains("Bob")) scores("Bob") else 0
等价于
val bobsScore = scores.getOrElse("Bob", 0)

4.3 更新映射的值

//更新键“Bob”对应的值
scores("Bob") = 10
//增加新的键/值对偶
scores("Fred") = 7

或者,你也可以用+=操作来添加多个关系:

scores += ("Bob" -> 10, "Fred" -> 7)-=来移除某个键和对应的值
scores -= "Alice"

还可以用+号来新建映射

val newScores = score + ("Bob" -> 10, "Fred" -> 7)//更新过的新映射

也可以用减号去掉某些不需要的值

scores = scores - "Alice"

这样就可以得到一个新的映射,虽然scores是不可变的

4.4 迭代映射

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

还可以单独获取键或值

scores.keySet //返回的是一个集合
for (v <- scores.values) println(v)

要翻转一个映射,可以:

for ((k,v) <- 映射) yield (v,k)

4.5 已排序映射

scala可以有不用的映射实现,比如哈希表或者一个平衡树。默认是哈希表。当对使用的键没有很好的哈希函数,或者需要顺序地访问所有的键,可以用树形映射。

val scores = scala.collections.immutable.SortedMap("Alice" -> 10,
"Fred" -> 7, "Bob"-> 3, "Cindy" -> 8)

上面创建的树形映射是不可变的。

4.6 拉链操作

val symbols = Array("<","-",">")
val counts = Array(2,10,2)
val pairs = symbols.zip(counts)

得到对偶数组

Array(("<",2), ("-",10), (">",2))

练习

val map1 = Map("ji" -> 10,"ya" -> 9)
val map2 = for ((k,v) <- map1) yield (k, 0.9 * v)
val in = new java.util.Scanner(new java.io.File("myFile.txt"))
val wordCount = new scala.collection.mutable.HashMap[String,Int]
while(in.hasNext()) {
	val key = in.next()
	val value = if (wordCount.contains(key)) wordCount(key) else 0
	wordCount(key) = value + 1
}
for ((k,v) <- wordCount) println(k,v)
val in = new java.util.Scanner(new java.io.File("myFile.txt"))
val wordCount = Map("" -> 0)
while(in.hasNext()) {
	val key = in.next()
	val value = if (wordCount.contains(key)) wordCount(key) else 0
	wordCount = wordCount + (key,value + 1)
}
def minmax(values:Array[Int]):Tuple2[Int,Int] =  {
	(values.min, values.max)
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值