好吧,我试着用一种有点抽象的方式回答。
首先让事情变得不那么模棱两可,让我们假设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 和List 和MyObjects,现在你只需要遍历计算小计的地图! (事实上,这可能在上面的循环中更早完成,但是为了让事情更清楚,我们浪费了更多的 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