List的总和<整数,整数=“”> Java中的元素</integer,>

时间:2015-03-20 10:15:59

标签: java search arraylist

我有一个ArrayList,其中Integer valuesPairs。我想总结列表中左边元素相同的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不起作用。

对不起编辑。

4 个答案:

答案 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