2011-06-21 34 views
5

は私がscala TreeMapからキーを設定して取得するには?

import scala.collection.immutable.TreeMap 

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

今すぐ上記の宣言の後、私は(「foo」という、「バー」)を一覧表示するキー「K1」を割り当てるしたとし 、その後どのように私が取得したり、キー「K1をリードバックします存在しない鍵 "k2"も読み戻しますか?

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

答えて

11

valとは対照的にvar不変マップ変数にを参照している「突然変異」するための最良の方法:

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

それは、apply方法を使用して直接アクセスすることができ

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

方法はMatchErrorはKEでスローされますので、しかし、私はめったにこのようなマップにアクセスしていない:あなたは括弧を使用して、単にアクセスすることができますでのScalaのシンタックスシュガーキックyは存在しません。この場合

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

、存在しないキーの戻り値はNoneある:Vが値型であるOption[V]を返す代わりに、getを使用します。 のオプションの結果はどうすればよいですか?メソッドmapflatMapfiltercollect、およびgetOrElseを利用できます。試してパターンマッチングを避けるか、直接Option.getメソッドを使用してください!例えば

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

EDITvarとしてそれを宣言せずに地図を構築し、あなたには、いくつかの分別収集を変換することによりこれをやっていると仮定するとの一つの方法は、実行することですそれは折り目を介して。たとえば:

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

これはScalaでご利用の場合

+0

私の知る限りvalのために可能ではないかもしれないが、我々はvalが指しているオブジェクトへの参照を変更することはできませんが、我々は、オブジェクトの値を変更できることを意味します。したがって、より高性能なソリューションはvalに基づいており、上記の場合はvarではありません。 – ace

+0

@amc - 変更可能な構造が高性能を提供する場合にのみ、(もちろん)そうではない可能性があります。また、一回の呼び出しがより効果的であっても、他の必要条件(例えば、コレクションをプログラムの別の部分に安全に渡すなど)は、これと競合する可能性があります。例えば、可変構造の**コピー**を頻繁に取らなければならない。スカラ標準ライブラリには変更可能な 'TreeMap'がないことを指摘する価値もあります。 –

+0

あなたのコードをありがとうございますが、varとしてではなく、varとしてツリーを維持しながらそれを行う方法はありますか? – ace

関連する問題