Scala之哈希表使用探究
??????? 一个经典的程序员名言是:“如果只能用一种数据结构,那就用哈希表吧。”哈希表,更笼统的说,映射--是最灵活的数据结构之一。
?????? 下面介绍神奇的Scala对Map的使用
一、构造映射
??? 1.构造不可变映射
????
val scores=Map("Alice"->10,"Bob"->8,"City"->5)
?
???? 上述代码构造出一个不可变的Map[String,Int],其值不能不被改变(不能添加、不能更新值)
??? 2.构造可变映射
??? ?
val scores=scala.collection.mutable.Map("Alice"->10,"Bob"->8,"City"->5)
?
??? 3.构造一个空的映射
??? ?
val scores=new scala.collection.mutable.HashMap[String,Int]
?
??? 4.使用对偶定义映射
????
val scores=Map(("Alice",10),("Bob",8),("City",5))
?
二、操作映射
??? 1.获取映射中的值
????
val BobScores=scores("Bob")
?
???? 但是如果汀射中不包含请求中使用的键,则会抛出异常
???? 所以我们在取值之前可以用contains方法来查看映射中是否含有指定的键
????
val BobScores=if(scores.contains("Bob"))scores("Bob") else 0
?
????? 当然可以使用以下比较快捷的方式
???
val BobScores=scores.getOrElse("Bob",0)
val BobScores=scores.get("Bob")
?
????? 这样的调用返回一个Option对象,要么是Some(键对应的值),要么是None
??? 2.在映射中添加或者更新关系
??????
scores("EE")=10
scores("Bob")=10
?
????? 更新或者添加多个关系
?????
scores+=("AA"->10,"BB"->8,"CC"->5)
?
?????? 移除映射中的关系
????
scores-="Bob"
?
??????
?????? 我们不更更新不可变数组但是我们可以获得一个需要更新的心的映射
???????
val tmp = Map("Alice" -> 10, "Bob" -> 8, "City" -> 5)
val combine = tmp + ("Alice" -> 10, "XX" -> 8)
val remove = combine - "Alice"
println(combine.mkString("、"))
println(remove.mkString("、"))
?
?????? 打印结果:
????????
Alice -> 10、Bob -> 8、City -> 5、XX -> 8
Bob -> 8、City -> 5、XX -> 8
?
??
三、迭代映射
?????? 1.遍历映射中的元素
?????? ??? for((k,v)<-映射) 处理k,v
?????? ??? 例,这里涉及模式匹配的知识,在后面会有介绍到
?????? ?
for((k,v) <- remove){
print(k+"--->")
println(v)
}
println(remove.keySet)
println(remove.values)
?
??? ??? 打印出
??? ??? Set(Bob, City, XX)
??? ??? MapLike(8, 5, 8)
??? ??? 2.当然我们可以进行一个映射的反转
??? ????
val scores = scala.collection.mutable.Map("Alice" -> 10, "Bob" -> 8, "City" -> 5)
?
??? ??? ?//我们可以用这种比较容易理解的方式
??? ??
val test = for ((k, v) <- scores) yield (v, k)
?
??? ???? //但是我们也可以使用这种更加Scala的用法
??? ???
val easy = scores.map(x => (x._2, x._1))
println("scores:\n"+scores.mkString("、"))
println("test:\n"+test.mkString("、"))
println("easy:\n"+easy.mkString("、"))
?
??? ???? 打印结果为
??? ??
scores:
Bob -> 8、City -> 5、Alice -> 10
test:
8 -> Bob、5 -> City、10 -> Alice
easy:
8 -> Bob、5 -> City、10 -> Alice
?
??? ???
??? ??? 3.我们也可以对映射进行过滤,下面的例子是对map进行过滤并反转键值
??? ??? //这是一种比较常规的方法
??? ??
val forFilter = for ((k, v) <- scores if v > 6) yield (v, k)
?
??? ??? ?//这是比较Scala的做法也是让我狂热的方法
???
val scalaFilter = scores.filter(x => (x._2 > 6)).map(x => (x._2, x._1)
???????? 关于Map的就介绍这里
?
原文:http://come-for-dream.iteye.com/blog/2157796