开发者

How to set and get keys from scala TreeMap?

Suppose I have

import scala.collection.immutable.TreeMap

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

Now after above declaration, I want to assign key "k1" to List("foo", "bar") and then how 开发者_运维百科do i get or read back the key "k1" and also read back non-existent key "k2"?

what happens if I try to read non-existent key "k2" ?


The best way to "mutate" the immutable map is by referring to it in a variable (var as opposed to val):

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

It can be accessed directly using the apply method, where scala syntactic sugar kicks in so you can just access using parens:

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

However, I rarely access maps like this because the method will throw a MatchError is the key is not present. Use get instead, which returns an Option[V] where V is the value-type:

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

In this case, the value returned for an absent key is None. What can I do with an optional result? Well, you can make use of methods map, flatMap, filter, collect and getOrElse. Try and avoid pattern-matching on it, or using the Option.get method directly!

For example:

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

EDIT: one way of building a Map without declaring it as a var, and assuming you are doing this by transforming some separate collection, is to do it via a fold. For example:

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

This may not be possible for your use case

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜