簡體   English   中英

清單總數 <Integer, Integer> Java中的元素

[英]Sum of List<Integer, Integer> elements in Java

我有一個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將無法正常工作。

抱歉!

您的問題是,您僅在循環中添加兩個元素,這些元素適用於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

最后,在地圖上進行迭代,並根據需要構建新的配對列表。

如果還需要獲取原始對,則創建一個容器對象以用作包含總和以及對總和作出貢獻的對的列表的值。 我將把代碼留給您練習。

這是未經測試的代碼,但應該可以給您一個思路

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);   

ps (根據評論):將新對添加到列表:

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)));

使用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));
}

看來您需要一些被入侵的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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM