有没有办法重新组合番石榴多图元素。例如,我们假设我们有这个多图:
Multimap<String, Integer> testMultimap = ArrayListMultimap.create();
testMultimap.put("key1", 15);
testMultimap.put("key2", 12);
testMultimap.put("key1", 20);
我们希望得到每个多图的关键元素的总和。那么有没有一种番石榴方式来处理这个并得到一个像这样的简单结果图:
resultMap => "Key1": 35, "Key2": 12
提前致谢。
答案 0 :(得分:3)
看起来你首先使用了错误的收藏 - 而不是Multimap
你应该使用Multiset
。来自Guava Wiki:
Guava提供了一种新的集合类型Multiset,它支持添加 多个元素。维基百科在数学中定义了一个多重集, 作为“允许成员的集合概念的概括” 不止一次出现......在多集合中,就像在集合中一样,与之相反 元组,元素的顺序无关紧要:多重集
{a, a, b}
和{a, b, a}
是平等的。“有两种主要方式来看待这个:
- 这就像没有排序约束的
ArrayList<E>
:排序无关紧要。- 这就像
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
。)
答案 1 :(得分: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:在这里使用番石榴方式的优点是我们可以定义多个函数,然后在它们之间切换,轻松抛出接口Function<Collection<Integer>, Number>
。
答案 2 :(得分: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);
}
答案 3 :(得分: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
);
答案 4 :(得分: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());
}