我有一个如下的POJO:
public class AgentSales {
private String agent;
private int month;
private int year;
private int salesCount;
public AgentSales(String agent, int month, int year, int salesCount) {
// initializers ...
}
// getters & setters
// ...
}
还有一个类似以下的集合:
ArrayList<AgentSales> salesList = new ArrayList<AgentSales>();
salesList.add(new AgentSales("Ben", 1, 2013, 3));
salesList.add(new AgentSales("Ben", 1, 2013, 2));
salesList.add(new AgentSales("Ben", 2, 2013, 1));
salesList.add(new AgentSales("Ben", 3, 2013, 1));
salesList.add(new AgentSales("Ben", 2, 2013, 2));
salesList.add(new AgentSales("Tim", 1, 2013, 1));
salesList.add(new AgentSales("Tim", 1, 2013, 1));
salesList.add(new AgentSales("Tim", 2, 2013, 1));
salesList.add(new AgentSales("Tim", 4, 2013, 1));
salesList.add(new AgentSales("Tim", 2, 2013, 5));
salesList.add(new AgentSales("Joe", 2, 2013, 1));
salesList.add(new AgentSales("Joe", 2, 2013, 2));
salesList.add(new AgentSales("Joe", 3, 2013, 1));
salesList.add(new AgentSales("Joe", 3, 2013, 2));
salesList.add(new AgentSales("Joe", 3, 2013, 1));
我如何重构/聚合此ArrayList的内容,以便将与同一月份和代理对应的多个项目合并为1,并汇总salesCount值?
Agent | month | year | sales count
----------------------------------
Ben | 1 | 2013 | 5
Ben | 2 | 2013 | 3
Ben | 3 | 2013 | 1
Tim | 1 | 2013 | 2
Tim | 2 | 2013 | 6
最佳答案
使用HashMap<String,AgentSales>
,其中键为agent + month + year进行汇总。
有点像这样:
HashMap<String,AgentSales> aggregate = new HashMap<>();
for (AgentSales as : salesList) {
String key = as.getAgent() + as.getMonth() + as.getYear();
AgentSales existing = aggregate.get(key);
if (existing==null) {
aggregate.put(key,as);
continue;
}
AgentSales combined = new AgentSales(as.getAgent(), as.getMonth(), as.getYear(), as.getSalesCount()+exisgint.getSalesCount());
aggregate.put(key, combined);
}
现在,您在地图中有了按代理商+月+年的组合值。然后,您可以像下面的ArrayList一样将它们取回:
ArrayList<AgentSales> asList = new ArrayList<>(aggregate.values());
然后您可以对此排序(通过编写
Comparator<AgentSales>
或使AgentSales实现Comparable<AgentSales>
)并打印出来