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

3

看起来您首先使用了错误的集合 - 而不是Multimap您应该使用Multiset. 来自番石榴维基

Guava 提供了一种新的集合类型 Multiset,它支持添加多个元素。维基百科在数学中将多重集定义为“集合概念的概括,其中成员被允许多次出现......多集{a, a, b} 并且{a, b, a}相等。”</p>

有两种主要的看待方式:

  • 这就像ArrayList<E>没有排序约束:排序无关紧要。
  • 这就像 a Map<E, Integer>,带有元素和计数。

Multiset你的例子将是:

Multiset<String> bag = HashMultiset.create();
bag.add("key1", 15);
bag.add("key2", 12);
bag.add("key1", 20);

然后 bag 将包含 35 次出现的“key1”和 12 次出现的“key2”,bag.toString(){ key1 x 35, key2 x 12 }. (LinkedHashMultiset如果您想保留键的顺序,请使用)。

于 2013-11-05T18:11:20.050 回答
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方式的好处是,我们可以定义多个函数,然后在它们之间切换很容易抛出接口Function<Collection<Integer>, Number>

于 2013-11-05T16:07:02.027 回答
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 回答
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
public static void main(String[] args) {

Multimap<String, Integer> data = ArrayListMultimap.create();
data.put("Alex", 10);
data.put("Tom", 20);
data.put("sirmagid", 30);
data.put("sirmagid", 31);

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

Set<String> keys = data.keySet();
for(String key : keys){
    Collection<Integer> coll = (Collection<Integer>) data.get(key);
    int sum = 0;
    for(Integer i : coll){
        sum += i;
    }
    resultMap.put(key, sum);
}


for (Map.Entry entry : resultMap.entrySet())
{    
System.out.println("key: " + entry.getKey() + "; value: " + entry.getValue());
}

库谷歌番石榴

于 2018-02-20T20:35:27.673 回答