5

私が持っているとしましょう

import scala.collection.immutable.TreeMap

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

上記の宣言の後、キー "k1" を List("foo", "bar") に割り当て、キー "k1" を取得または読み取り、存在しないキー "k2" を読み取るにはどうすればよいですか?

存在しないキー "k2" を読み取ろうとするとどうなりますか?

4

1 に答える 1

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 構文糖衣が作動するため、括弧を使用してアクセスするだけです。

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

MatchErrorただし、メソッドがis the key is not presentをスローするため、このようなマップにアクセスすることはめったにありません。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オプションの結果で何ができますか? mapflatMapfiltercollectおよびのメソッドを利用できますgetOrElse。それに対するパターンマッチングや、Option.getメソッドを直接使用することは避けてください!

例えば:

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

EDIT : Map を として宣言せずに構築する方法の 1 つはvar、別のコレクションを変換してこれを行うと仮定すると、折り畳みを介して行うことです。例えば:

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

これは、ユースケースでは不可能な場合があります

于 2011-06-21T09:14:01.980 に答える