2016-05-04 10 views
1

可変セットの2つの可変マップをマージする最も良い方法は何ですか?操作は可換でなければなりません。私が試した事がscala:可変セットの2つの可変マップをマージする最良の方法

import scala.collection.mutable 
var d1 = mutable.Map[String, mutable.SortedSet[String]]() 
var d2 = mutable.Map[String, mutable.SortedSet[String]]() 

// adding some elements. Accumulating nimals with the set of sounds they make. 
d1.getOrElseUpdate("dog", mutable.SortedSet[String]("woof")) 
d2.getOrElseUpdate("cow", mutable.SortedSet[String]("moo")) 
d2.getOrElseUpdate("dog", mutable.SortedSet[String]("woof", "bark")) 

魔法(つまりは可換である!)...醜いようだ

scala.collection.mutable.Map[String,scala.collection.mutable.SortedSet[String]] = 
Map(dog -> TreeSet(bark, woof), cow -> TreeSet(moo)) 

は基本的に、私はセットをマージする++の定義を上書きしたいです一致するマップキー。 d1 ++ d2は正しい答えを示しますが、d2 ++ d1はそうではありません(++はここでは可換ではありません)。その結果Mapになり、すべてのキーの場合

+0

なぜ変更できますか?マップの1つを他のマップの値で更新しますか? – Kolmar

+0

それについて考えてみると、私はおそらく不変でも使うことができます。私はこれをどのように使用していたのかは分かりません。編集を参照 –

答えて

2

、あなたはそのキーのd1d2から値にSet秒(++)をマージする必要があります。 mutable.Map sおよびmutable.Set秒間

あなたがMap Sの1を更新しているとき、実装は本当に簡単です:

for ((key, values) <- d2) 
    d1.getOrElseUpdate(key, mutable.SortedSet.empty) ++= values 

あなたが実際に空mutable.Mapを作成し、でそれを更新するために、そのコードを使用することができますd1およびd2(必要に応じて他のMap)を任意の順序で使用してください。

(
    for (key <- d1.keySet ++ d2.keySet) 
    yield key -> (d1.getOrElse(key, Set.empty) ++ d2.getOrElse(key, Set.empty)) 
).toMap 
、他の可能性がより効果的で、おそらくもう少し

:不変Mapの一つの可能​​な実装であるために

val d1 = mutable.Map[String, mutable.SortedSet[String]](
    "dog" -> mutable.SortedSet("woof"), 
    "cow" -> mutable.SortedSet("moo")) 
val d2 = mutable.Map[String, mutable.SortedSet[String]](
    "dog" -> mutable.SortedSet("woof", "bark")) 

def updateMap[A, B : Ordering](// `Ordering` is a requirement for `SortedSet` 
    d1: mutable.Map[A, mutable.SortedSet[B]])(
    // `Iterable`s are enough here, but allow to pass a `Map[A, Set[B]]` 
    d2: Iterable[(A, Iterable[B])] 
): Unit = 
    for ((key, values) <- d2) 
    d1.getOrElseUpdate(key, mutable.SortedSet.empty) ++= values 

// You can call 
// `updateMap(d1)(d2)` or 
// `updateMap(d2)(d1)` to achieve the same result (but in different variables) 

あなたは、以下の機能で、この操作をラップすることができます複雑な実装も可能である。

関連する問題