如何从scala TreeMap设置和获取密钥?

时间:2011-06-21 09:10:13

标签: scala treemap

假设我有

import scala.collection.immutable.TreeMap

val tree = new TreeMap[String, List[String]]

现在在上述声明之后,我想将键“k1”分配给List(“foo”,“bar”) 然后我如何获取或读回密钥“k1”并回读不存在的密钥“k2”?

如果我尝试读取不存在的密钥“k2”会发生什么?

1 个答案:

答案 0 :(得分:11)

“突变”不可变地图的最佳方法是在变量(var而不是val)中引用它:

var tree = TreeMap.empty[String, List[String]]
tree += ("k1" -> List("foo", "bar")) //a += b is sugar for "c = a + b; a = c"

可以使用apply方法直接访问它,其中scala语法糖启动,因此您只需使用parens进行访问:

val l = tree("k1") //equivalent to tree.apply("k1")

但是,我很少访问这样的地图,因为该方法将抛出MatchError,因为密钥不存在。请改用get,返回Option[V],其中V是值类型:

val l = tree.get("k1") //returns Option[List[String]] = Some(List("foo", "bar"))
val m = tree.get("k2") //returns Option[List[String]] = None

在这种情况下,缺少密钥的值为None。使用可选结果我该怎么办?好吧,您可以使用方法mapflatMapfiltercollectgetOrElse。尝试并避免使用模式匹配,或直接使用Option.get方法!

例如:

val wordLen : List[Int] = tree.get("k1").map(l => l.map(_.length)) getOrElse Nil

编辑构建地图的一种方式,而不将其声明为var,并假设您通过转换某个单独的集合来实现此目的,就是通过折。例如:

//coll is some collection class CC[A]
//f : A => (K, V)
val m = (TreeMap.empty[K, V] /: coll) { (tree, c) => tree + f(c) }

这可能不适用于您的用例