2

重複の可能性:
2つのマップをマージし、同じキーの値を合計する最良の方法は?

タイプのマップがたくさんありますMap[String, Int]。キーが対応するときに値の合計をとってそれらをマージできるようにしたいと思います。たとえば、++マップの標準的な方法では、

Map("a" -> 1, "b" -> 2) ++ Map("a" -> 3, "c" -> 5)
// Map[String,Int] = Map(a -> 3, b -> 2, c -> 5)

結果として得られる操作を定義したいと思います

Map("a" -> 1, "b" -> 2) ?? Map("a" -> 3, "c" -> 5)
// Map[String,Int] = Map(a -> 4, b -> 2, c -> 5)

派手な言い回しでは、常にモノイドの自然な構造を持っていますが、それ自体がモノイドであるMap[A, B]場合は別の構造があります。B

さて、たとえば、の再帰的な実装を書くのは難しいことではLinkedHashMapありませんが、おそらくscalazを使用して、これを書くための簡単でより一般的な方法が必要だと思います。何か案は?

4

2 に答える 2

7

Bもモノイドである場合、ScalazにはMap [A​​、B]のモノイドインスタンスがあります。

> Map("a" -> 1, "b" -> 2) |+| Map("a" -> 3, "c" -> 5)
  Map("a" -> 4, "c" -> 5, "b" -> 2)
于 2012-09-21T11:19:21.723 に答える
0

実際にをとして使用しようとしているようMapですMultiset。マルチセットの場合、説明している操作は単なるマルチセットの合計s1 ⊎ s2です。

残念ながら、ScalaコレクションフレームワークにはマルチセットはありませんがJava用のマルチセットがいくつかあります

MultisetScalaの仮想の場合:

Multiset("a", "b", "b") ++ Multiset("a", "a", "a", "c", "c", "c", "c", "c")
// Multiset[String] = Multiset("a" -> 4, "b" -> 2, "c" -> 5)
于 2012-09-19T14:13:54.657 に答える