我有一个如下的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>)并打印出来

07-28 03:07