我因为从列表对象创建小计而被卡住了。代码就像这样,
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
有人可以指导我如何做到这一点吗?
之前感谢,
答案 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
List
个MyObject
,现在你只需要遍历计算小计的地图! (事实上,这可能在上面的循环中提前完成,但为了使事情更清楚,我们浪费了更多的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