我有一个ArrayList
,其中Integer values
为Pairs
。我想总结列表中左边元素相同的right
元素。
例如,输入arrayList将包含:
final List<Pair<Integer, Integer>> a = new ArrayList<>();
a.add(new Pair<>(1, 1));
a.add(new Pair<>(2, 1));
a.add(new Pair<>(2, 3));
New ArrayList should contain:
如下所示:
(常用左值,左值相同的所有正确值的总和)
1, 1
2, 4
我编写的代码不会返回有效值:
for (int i=0; i< a.size(); i++){
//need help here
}
编辑:我想要重复对,所以HashMap不起作用。
对不起编辑。
答案 0 :(得分:1)
你的问题是你只在你的循环中添加两个元素,这些元素适用于1但不适用于2.相反,你应该使用一个映射,其中键是第一个数字(在你的情况下是1或2),值是总和。
然后,您可以独立地遍历两个列表,获取左侧数字的当前值,为其添加正确的数字并将结果放回到地图中。如果还没有值,则假定为0。
这样的事情:
Map<Integer, Integer> sums = new HashMap<>();
for( Pair<> p : a ) {
Integer sum = sums.get(p.left);
if( sum == null ) {
sums.put( p.left, p.right ); //nothing there yet, so just add the first value
} else {
sums.put( p.left, sum + p.right ); //add to the existing sum
}
}
//do the same for b
最后迭代地图并根据需要构建新的对列表。
如果您还需要获取原始对,请创建一个容器对象,以用作包含总和的值以及对该总和作出贡献的对的列表。我会把代码作为练习留给你。
答案 1 :(得分:1)
这是未经测试的代码,但应该给你一个想法
HashMap<Integer, Integer> result = new HashMap<Integer, Integer>();
List<Pair<Integer, Integer>> list = new ArrayList<Pair<Integer, Integer>>();
for (Pair p : a)
if (result.containsValue(p.left))
result.put(p.left, p.right +result.get(p.left)); // add if existing
else
result.put(p.left, p.right); // assign if not existing
for (Pair p : b)
if (result.containsValue(p.left))
result.put(p.left, p.right +result.get(p.left));
else
result.put(p.left, p.right);
p.s。 (根据评论):将新对添加到列表中:
for (Pair p : a)
list.add(new Pair(p.left, result.get(p.left)));
for (Pair p : b)
list.add(new Pair(p.left, result.get(p.left)));
答案 2 :(得分:1)
使用org.springframework.util.MultiValueMap:
List<Pair<Integer, Integer>> result = new ArrayList<>();
a.addAll(b); //now there is only one list
//key -> Integer, value -> List<Integer>
MultiValueMap<Integer, Integer> values = new LinkedMultiValueMap<Integer, Integer>();
for (Pair p : a)
values.add(p.left, p.right);
for (Integer key : values.keySet()) {
Integer sum = 0;
for (Integer right : values.get(key))
sum += right;
result.add(new Pair(key, sum));
}
答案 3 :(得分:1)
看起来您需要一些被黑客攻击的HashMap
,它会对值进行求和而不是替换它们:
class SummingMap extends HashMap<Integer, Integer> {
@Override
public Integer put(Integer key, Integer value) {
Integer oldResult = get(key);
return super.put(key, value + (oldResult == null ? 0 : oldResult));
}
}
如果您希望按键对条目进行排序,则应使用某种SortedMap
,例如TreeMap
:
class SummingMap extends TreeMap<Integer, Integer> {
... // the same code as above