2

この質問ごと:

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

欲しいものを得るには scalaz を使う必要がありますが、以下が期待通りに動かない理由を知っている人がいたら知りたいです。

Map(1->2.0)+(1->1.0)     //Map(1->1.0)

これにより、 が発生すると予想され Map(1->3.0)ます。ただし、次のように、マップは最後のキーのみを返すようです。

Map(1->1.0, 1->3.0)     //Map(1->3.0)

したがって、ドキュメントに基づいて

このコレクションに 2 つ以上の要素を追加し、新しいコレクションを返します。

上記のように、マップは値を格納する可能性がありますが、最後のアイテムのみを返すと思いますか? これは、追加が何をすべきかについての私の直感ではありません...おそらくそれは効率的な動きです。

もう少し時間があれば、コードを見て、そこから理解しようとしますが、誰かがすでに知っている場合に備えて、ここで質問したかったのですか?

4

2 に答える 2

6

効率とは何の関係もありません。それはタイピングです。 Mapplus 要素は、互換性のある型のマップを返します。型がわからないので、数の足し算もわかりません。代わりにそれらをリストすることもできますがSeq(2.0,1.0)、 のスーパータイプではありません2.0。したがってAny、型をまっすぐに保つことに関してはまったく役に立たず、既存の要素を別の要素に置き換える方法がありません。

そのため+、キーが存在しない場合は新しい要素を追加し、キーが存在する場合は既存の要素を置き換えます。(ただし、ドキュメントにはそう記載されているはずです。)

「その他」の動作が必要な場合は、より複雑な変換が必要です。それが、要素への自然な追加のために|+|Scalazが行うことです。

于 2013-05-08T21:37:19.307 に答える
1

@RexKerrの答えは完全に正しいですが、ここでは重大な誤解を強調していないと思います。

手段に対する+操作- 新しいキー/値のペアをマップに配置します (そのキーの既存のペアを置き換える可能性があります)。足し算とは何の関係もありません(そして、レックスの答えは、必ずしも足し算とは何の関係もないことをさらに説明しています)。あなたは C# のバックグラウンドを持っているように見えるので、次のことを考える必要があります。Mapput

myMap + (1, 1.0)

そのまま

myMap[1] = 1.0

新しいキーと値のペアを挿入する機能は、Map/Dictionary データ型の基本的な操作です。エンコードする機能は、それほど基本的なものではありません (参照する質問とここで言及されているように、マップをキーでマージするより一般的な機能の特殊なケースです)。

于 2013-05-09T12:51:27.417 に答える