2009-11-27 7 views

答えて

5

"私はScalaの特性に混在する新しいオブジェクトを作成する必要がありますか?"はいです。ラッピングオブジェクトと暗黙的な変換によって、痛みを最小限に抑えることができます。あなたの特定の問題については


、私はあなたが「マルチマップとMapProxy」でそれをラップする必要があります可変セットに変更可能なマップを返すようにGROUPBY(...)を強制することができませんでした。しかし、「GROUPBY」の独自のバージョンを実装するためのコードがあまりにも多くの行ではありません。ここで

package blevins.example 

object App extends Application { 

    implicit def multiMapable[B](c: Iterable[B]) = new { 
    def groupByMM[A](f: B => A) = { 
     import scala.collection.mutable._ 
     val ret = new HashMap[A,Set[B]] with MultiMap[A,B] 
     for (e <- c) { ret.addBinding(f(e), e) } 
     ret 
    } 
    } 

    val c = List(1,2,3,4,5,6,7,8,9) 
    val mm = c.groupByMM { i => if (i < 5) "alpha" else "beta" } 
    mm.addBinding("alpha",12) 
    println(mm) // Map(beta -> Set(5, 7, 6, 9, 8), alpha -> Set(3, 1, 4, 2, 12)) 

} 

補遺

は、既存の地図をラッピングの一例である[文字列、設定[INT]]マルチマップへ値をコピーせず:シードマップはbに必要とされるので、これはGROUPBY(...)の結果で行うことができないこと

object App extends Application { 
    import scala.collection.mutable._ 
    val seed: Map[String,Set[Int]] = Map("even" -> Set(2,4,6), "odd" -> Set(1,3,5)) 

    val multiMap = new MapProxy[String,Set[Int]] with MultiMap[String,Int] { 
    val self = seed 
    } 

    multiMap.addBinding("even", 8) 
    println(multiMap) // Map(odd -> Set(5, 3, 1), even -> Set(6, 8, 4, 2)) 
} 

注e mutableおよびgroupBy(...)は不変のマップを返します。

+0

groupBy()と変更可能なコレクションを呼び出すと、変更可能なマップが返されます。 –

+0

groupByが変更可能なMapを返すことを実演できますか?私はここに示されているようなコンパイラのエラーが出ます(http://gist.github.com/245062)。 –

+0

私はそれが可変セットの不変のマップを返すと思いますか?それにもかかわらず、私はマップをまったく必要としません、私はマルチマップが欲しいです。 –

関連する問題