2

グアバのマルチマップ要素を再グループ化する方法はありますか? たとえば、次の multimap があるとします。

Multimap<String, Integer> testMultimap = ArrayListMultimap.create();
testMultimap.put("key1", 15);
testMultimap.put("key2", 12);
testMultimap.put("key1", 20);

そして、すべてのマルチマップの主要要素の合計を取得したいと考えています。これを処理し、次のような単純な結果マップを取得するグアバの方法はありますか?

resultMap => "Key1": 35, "Key2": 12

前もって感謝します。

4

5 に答える 5

1

私はそれを見つけました、私はこのようにすることができます:

Function<Collection<Integer>, Number> additionFunction = new Function<Collection<Integer>, Number>() {
    @Override
    public Number apply(Collection<Integer> numbers) {
        int sum = 0;
        for (Integer number : numbers) {
            sum += number; 
        }
        return sum;
    }
};

Maps.transformValues(testMultimap.asMap(), additionFunction);

PS :ここで guava を使用する利点は、複数の関数を定義し、それらを簡単に切り替えて interface をスローできることFunction<Collection<Integer>, Number>です。

于 2013-11-05T16:07:02.027 に答える
0

javadoc によると: http://google-collections.googlecode.com/svn/trunk/javadoc/com/google/common/collect/ArrayListMultimap.html、マップを初期化する別の方法があるかどうかはわかりません。

しかし、あなたはこれで何かをすることができます:

static final Map<String, Integer> testMap  = ImmutableMap.of(
        "key1", 15,
        "key2", 12
);
于 2013-11-05T12:37:16.047 に答える
0

Multimap の各キーはコレクションを生成するため、それを反復処理して要素の合計を取得し、それを別のマップに配置できます。

手元に Apache Common ライブラリがないのでテストしていませんが、同様のものが動作するはずです。

HashMap<String, Integer> resultMap = new HashMap<String, Integer>();

    Set<String> keys = testMultiMap.keySet();
    for(String key : keys){
        Collection<Integer> coll = (Collection<Integer>) testMultiMap.get(key);
        int sum = 0;
        for(Integer i : coll){
            sum += i;
        }
        resultMap.put(key, sum);
    }
于 2013-11-05T11:28:54.400 に答える