2011-06-21 5 views
5

varsayalım BenScala TreeMap'in anahtarları nasıl ayarlanır ve alınır?

import scala.collection.immutable.TreeMap 

val tree = new TreeMap[String, List[String]] 
Şimdi yukarıdaki beyanı sonra ben Listeye sonra ("foo", "bar") ve anahtar "k1" atamak istediğiniz

nasıl alabilirim veya anahtarı geri okuyorsun "k1 "ve ayrıca varolmayan anahtar" k2 "yi okuyor musunuz?

Varolmayan anahtar "k2" yi okumaya çalışırsam ne olur?

cevap

11

değişmez harita (val karşı var) bir değişkende kendisine atıfta olan "mutasyona" en iyi yolu:

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

doğrudan, burada apply yöntemi kullanılarak erişilebilir böylece de scala sözdizimsel şeker tekmeler kullanmakta parens erişmek sadece edebilirsiniz: yöntem MatchError atacağım çünkü nadiren böyle haritalar erişmek, ancak

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

ke olduğunu y mevcut değil. Bu durumda

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

, eksik bir anahtar için döndürülen değer None olup: V değer-tipi olduğu bir Option[V] döndürür, bunun yerine get kullanın. isteğe bağlı sonucuyla ne yapabilirim? Peki, map, flatMap, filter, collect ve getOrElse yöntemlerinden yararlanabilirsiniz. Desen eşlemesini deneyin ve önleyin ya da Option.get yöntemini doğrudan kullanın!

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

DÜZENLEME: Örneğin

bir var olarak açıklanmadan bir harita bina ve bazı ayrı toplama dönüştürerek yapıyoruz varsayarak tek yön, yapmaktır bir katla. Örneğin:

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

Bu kullanım örneği için mümkün olmayabilir

Scala içinde
+0

AFAIK val biz val için işaret ettiği nesnenin referansını değiştiremezsiniz ama biz nesnede değerlerini değiştirmek anlamına gelir . Dolayısıyla, daha yüksek performanslı bir çözüm, valide dayanır ve yukarıdaki durumda var değildir. – ace

+0

@amc - sadece değiştirilebilir bir yapı daha yüksek performans sunuyorsa, bu (tabii ki) olmayabilir. Ayrıca, tek bir çağrı daha performanslı olsa bile, diğer gereksinimler (örneğin, programı programın başka bir bölümüne güvenli bir şekilde iletme) bununla çatışabilir - örneğin, genellikle bir dönüştürülebilir yapının ** kopyasını ** almak zorunda kalabilirsiniz. . Ayrıca, scala standart kütüphanesinde herhangi bir “TreeMap” öğesi bulunmadığına işaret etmek de önemlidir. –

+0

Kodunuz için teşekkür ederiz, ancak ağacın değerini val olarak değil de varken değiştirmenin bir yolu var mı? – ace