映射(哈希表)是键值对偶的集合。
元组: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)
}