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

フリーウィンド
val map1 = Map(1 -> 9 , 2 -> 20)
val map2 = Map(1 -> 100, 3 -> 300)

それらをマージして、同じキーの値を合計したいと思います。したがって、結果は次のようになります。

Map(2->20, 1->109, 3->300)

今私は2つの解決策を持っています:

val list = map1.toList ++ map2.toList
val merged = list.groupBy ( _._1) .map { case (k,v) => k -> v.map(_._2).sum }

そして

val merged = (map1 /: map2) { case (map, (k,v)) =>
    map + ( k -> (v + map.getOrElse(k, 0)) )
}

しかし、もっと良い解決策があるかどうか知りたいです。

Andrzej Doyle

Scalazは、という概念がある半群、あなたがここで何をしたいのかキャプチャし、そして間違いなく最短/きれいな解決策につながります:

scala> import scalaz._
import scalaz._

scala> import Scalaz._
import Scalaz._

scala> val map1 = Map(1 -> 9 , 2 -> 20)
map1: scala.collection.immutable.Map[Int,Int] = Map(1 -> 9, 2 -> 20)

scala> val map2 = Map(1 -> 100, 3 -> 300)
map2: scala.collection.immutable.Map[Int,Int] = Map(1 -> 100, 3 -> 300)

scala> map1 |+| map2
res2: scala.collection.immutable.Map[Int,Int] = Map(1 -> 109, 3 -> 300, 2 -> 20)

具体的には、の二項演算子Map[K, V]はマップのキー結合し、V重複する値に対しての半群演算子を折りたたみます。の標準セミグループIntは加算演算子使用するため、重複する各キーの値の合計を取得します。

編集:user482745の要求に従って、もう少し詳細。

数学的には、半群は、そのセットから2つの値を取得し、そのセットから別の値を生成する演算子を含む、単なる値のセットです。したがって、加算中の整数は半群です。たとえば、+演算子は2つのintを組み合わせて別のintを作成します。

2つのマップを組み合わせて、何らかの形で2つのマップを組み合わせた新しいマップを作成する操作を考え出すことができる限り、「特定のキータイプと値タイプを持つすべてのマップ」のセットに対して半群を定義することもできます。入力。

両方のマップに表示されるキーがない場合、これは簡単です。両方のマップに同じキーが存在する場合は、キーがマップされる2つの値を組み合わせる必要があります。うーん、同じタイプの2つのエンティティを組み合わせる演算子について説明しただけではありませんか?これがMap[K, V]、Scalazで、の半群が存在する場合にのみ、の半群がV存在する理由です-Vの半群は、同じキーに割り当てられた2つのマップからの値を組み合わせるために使用されます。

ここでIntは値型であるため1キーの「衝突」は、2つのマップされた値の整数加算によって解決されます(これは、Intの半群演算子が行うことです)100 + 9したがって、値が文字列であった場合、衝突により、2つのマップされた値の文字列が連結されます(これも、Stringのセミグループ演算子が行うためです)。

(そして興味深いことに、文字列の連結は可換ではないため、つまり"a" + "b" != "b" + "a"、結果の半群演算も可換ではありません。したがって、Stringの場合とmap1 |+| map2は異なりますmap2 |+| map1が、Intの場合とは異なります。)

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

SQLで2つのテーブルをマージし、同じIDの値を合計する方法は?

分類Dev

同じキーの場合に2つのマップの値を追加する

分類Dev

Javaで同じキーを持つ2つのマップをマージし、値を加算します

分類Dev

同じID値を持つアイテムの特定の値をマージして合計する方法

分類Dev

2つの値を同じ配列の1つのキーにマージ/結合する方法

分類Dev

同じキーを持つ2つのネストされたマップをマージし、値を保持する方法

分類Dev

同じキーを持つ異なるハッシュマップの値の合計を計算するにはどうすればよいですか?

分類Dev

Javaで同じループ内の2つのハッシュマップを反復する最良の方法は何ですか?

分類Dev

カンマ区切りのマップキー/値を結合するための最良の方法

分類Dev

2つの多次元配列をマージし、両方の配列に同じIDが存在する場合は値を合計する

分類Dev

ペアの値が同じ場合は、同じ配列内の2つのペアをマージします

分類Dev

2つのデータセットをマージするための最良の方法(多分関数の場合?)

分類Dev

値が同じである同じキーを持つdictのリストをマージする方法は?

分類Dev

最初の値と2番目のキーをマージして、2つのdictを組み合わせる最良の方法

分類Dev

最初の値と2番目のキーをマージして、2つのdictを組み合わせる最良の方法

分類Dev

同じキー値を持つ2つの辞書をマージします

分類Dev

同様のタイプのオブジェクトの周りにgraphqlスキーマを設計するための最良の方法は何ですか?

分類Dev

Rails:特定のキーの値が同じ場合に2つのハッシュをマージするにはどうすればよいですか?

分類Dev

Javaのマップでペア(キー)値の合計を取得する方法は?

分類Dev

2つのマップから同じキーを削除する方法

分類Dev

Java:2つのマップのキーをマージする方法は?

分類Dev

Elixirの同じキーで2つのマップを組み合わせる

分類Dev

JavaScriptは同じキーを持つオブジェクトをマージし、それらの値を合計します

分類Dev

同じキー名の2つの辞書をマージする方法

分類Dev

JSONArrayで同じキーを持つ2つのJSONObjectを連結する最良の方法は何ですか

分類Dev

同じキーで2つの辞書をマージする

分類Dev

同じ値を持つすべてのマップキーを取得する

分類Dev

Python:2つの辞書を同じキーでマージする最もエレガントな方法

分類Dev

等しい値と同じキーセットの2つのハッシュマップを比較しますか?

Related 関連記事

  1. 1

    SQLで2つのテーブルをマージし、同じIDの値を合計する方法は?

  2. 2

    同じキーの場合に2つのマップの値を追加する

  3. 3

    Javaで同じキーを持つ2つのマップをマージし、値を加算します

  4. 4

    同じID値を持つアイテムの特定の値をマージして合計する方法

  5. 5

    2つの値を同じ配列の1つのキーにマージ/結合する方法

  6. 6

    同じキーを持つ2つのネストされたマップをマージし、値を保持する方法

  7. 7

    同じキーを持つ異なるハッシュマップの値の合計を計算するにはどうすればよいですか?

  8. 8

    Javaで同じループ内の2つのハッシュマップを反復する最良の方法は何ですか?

  9. 9

    カンマ区切りのマップキー/値を結合するための最良の方法

  10. 10

    2つの多次元配列をマージし、両方の配列に同じIDが存在する場合は値を合計する

  11. 11

    ペアの値が同じ場合は、同じ配列内の2つのペアをマージします

  12. 12

    2つのデータセットをマージするための最良の方法(多分関数の場合?)

  13. 13

    値が同じである同じキーを持つdictのリストをマージする方法は?

  14. 14

    最初の値と2番目のキーをマージして、2つのdictを組み合わせる最良の方法

  15. 15

    最初の値と2番目のキーをマージして、2つのdictを組み合わせる最良の方法

  16. 16

    同じキー値を持つ2つの辞書をマージします

  17. 17

    同様のタイプのオブジェクトの周りにgraphqlスキーマを設計するための最良の方法は何ですか?

  18. 18

    Rails:特定のキーの値が同じ場合に2つのハッシュをマージするにはどうすればよいですか?

  19. 19

    Javaのマップでペア(キー)値の合計を取得する方法は?

  20. 20

    2つのマップから同じキーを削除する方法

  21. 21

    Java:2つのマップのキーをマージする方法は?

  22. 22

    Elixirの同じキーで2つのマップを組み合わせる

  23. 23

    JavaScriptは同じキーを持つオブジェクトをマージし、それらの値を合計します

  24. 24

    同じキー名の2つの辞書をマージする方法

  25. 25

    JSONArrayで同じキーを持つ2つのJSONObjectを連結する最良の方法は何ですか

  26. 26

    同じキーで2つの辞書をマージする

  27. 27

    同じ値を持つすべてのマップキーを取得する

  28. 28

    Python:2つの辞書を同じキーでマージする最もエレガントな方法

  29. 29

    等しい値と同じキーセットの2つのハッシュマップを比較しますか?

ホットタグ

アーカイブ