在java中的列表对象的循环内按组进行求和

时间:2016-04-06 09:47:19

标签: java list object for-loop

我因为从列表对象创建小计而被卡住了。代码就像这样,

private List<Object> getData() {
    List<Object> items = new ArrayList<>();
    List<Object> objectList = dataBaseHelper.fetchData();

 for (Object obj : objectList) {
    items.add(new Object(obj.one, obj.two));
 }

return items;

}

我可以让列表很好,比如

a 1
a 2
a 3
b 1
b 2
b 3

但我希望像我这样列出我的名单,

    a       1
    a       2
    a       3
subTotal a  6

    b       1
    b       2
    b       3
subTotal b  6

有人可以指导我如何做到这一点吗?

之前感谢,

1 个答案:

答案 0 :(得分:0)

好吧,我会尝试以一种抽象的方式回答。

首先让事情变得不那么模糊,让我们假设dataBaseHelper.fetchData()返回List<MyObject>,其中MyObject有以下成员:

  • public String name;
  • public int price;

现在让我们假设我们想要通过名称计算小计分组。然后我们需要一个可以保存这样数据的数据结构。一些简单的缘故,让我们只使用一个列表地图:

Map<String, List<MyObject>> subTotalsByName = new HashMap<>();

然后我们可以遍历返回的数据:

private Map<String, List<MyObject>> getData() {
  Map<String, List<MyObject>> subTotalsByName = new HashMap<>();
  List<MyObject> objectList = dataBaseHelper.fetchData();

  for (MyObject obj : objectList) {
    List<MyObject> subTotalList = subTotalsByName.get(obj.name);
    if (subTotalList == null){
        subTotalList = new ArrayList<>();
        subTotalsByName.put(obj.name, subTotalList);
    }

    subTotalList.add(obj);
  }

  return subTotalsByName;
}

(注意:以上代码未经测试,将其视为伪代码,只是为了让您了解按小计分组的内容)

现在你有Map ListMyObject,现在你只需要遍历计算小计的地图! (事实上​​,这可能在上面的循环中提前完成,但为了使事情更清楚,我们浪费了更多的CPU周期来明确地做事。不过做过早优化也是个好主意:))

for (Entry<String, List<MyObject>> entry : subTotalsByName.entrySet()) {

  int subtotal = 0;

  List<MyObject> myObjects = entry.getValue();
  for (MyObject myObj : myObjects){
    System.out.println(myObj.name + " " + myObj.price);
    subtotal += myObj.price;
  }

  System.out.println("subTotal for " + entry.getKey() + " is " + subtotal);
  System.out.println();
}

(同样,这是未经测试的,视为伪代码)

然后你得到这样的输出:

a 1
a 2
a 3
subTotal for a is 6

b 4
b 5
b 6
subTotal for b is 15