1

2 つのマップの値を合計し、グアバを使用して合計値を含むマップを返すにはどうすればよいですか? 両方のマップが同じキーのセットを持つことは間違いありません。

例:

Map<OccupancyType, BigDecimal> filteredPrice
[ 1 : 100 ]
[ 2 : 50 ]
[ 3 : 200 ]

その他の地図

Map<OccupancyType, BigDecimal> pkgPrice
[ 1 : 10 ]
[ 2 : 20 ]
[ 3 : 30 ]

合計マップ

Map<OccupancyType, BigDecimal> sumPrice
[ 1 : 110 ]
[ 2 : 70 ]
[ 3 : 230 ]

これらのマップを繰り返し処理して値を簡単に合計できることはわかっていますが、グアバ メソッドの 1 つを使用してこれを行うよりクリーンな方法はありますか?

4

2 に答える 2

4

グアバの寄稿者はこちら。

両方のマップに同じキーがあることが確実な場合は、できると思います

Maps.transformEntries(pkgPrice,
    new EntryTransformer<OccupancyType, BigDecimal, BigDecimal>() {
  public BigDecimal transformEntry(OccupancyType key, BigDecimal pkPrice) {
    return pkPrice.add(filteredPrice.get(key));
  }
});

とはいえ、これは「直接的なアプローチが最もクリーン」なカテゴリに真っ向から当てはまるようです。 (さらに、この実装は、コピーを行わない限り、値を要求するたびに値を再計算します。それでも、これはほぼ確実に不必要に複雑です。ここでは、直接的で命令的なアプローチがほぼ確実に望ましいです。

于 2012-06-27T10:02:01.347 に答える
2

Functionaljavaの場合:

map のモノイドインスタンスを定義できます。(これがライブラリにまだ存在していないことに驚いています。)

public static <K, V> Monoid<Map<K, V>> mapMonoid(final Monoid<V> valueMonoid) {
  return new Monoid<Map<K, V>>(

    // associative binary operation
    new F2<Map<K, V>, Map<K, V>, Map<K, V>>() {
      public Map<K, V> f(Map<K, V> m1, Map<K, V> m2) {
        // logic for merging two maps
      }
    },

    // identity
    new HashMap<K, V>()
  ); 
}

そして、それを次のように使用します。

Map<Integer, Integer> mergedMap = 
  mapMonoid(Monoid.intAdditionMonoid).sum(m1, m2);

このようにして、マップのリストを合計することもできます。

List<Map<Integer, Integer>> maps = /* list of maps */;
Map<Integer, Integer> total = 
  mapMonoid(Monoid.intAdditionMonoid).sumLeft(maps);
于 2012-06-27T10:46:08.320 に答える