每年获取计数
这是我尝试过的
public static void main(String args[])
{
List<Map<String,Integer>> list_map = new ArrayList<Map<String,Integer>>();
Map<String, Integer> map1 = new HashMap<String,Integer>();
map1.put("Year",2018);
map1.put("Month",1);
map1.put("Cost",100);
list_map.add(map1);
Map<String,Integer> map2 = new HashMap<String,Integer>();
map2.put("Year",2018);
map2.put("Month",2);
map2.put("Cost",200);
list_map.add(map2);
Map<String,Integer> map3 = new HashMap<String,Integer>();
map3.put("Year",2018);
map3.put("Month",3);
map3.put("Cost",300);
list_map.add(map3);
Map<String,Integer> map4 = new HashMap<String,Integer>();
map4.put("Year",2017);
map4.put("Month",1);
map4.put("Cost",400);
list_map.add(map4);
Map<String,Integer> map5 = new HashMap<String,Integer>();
map5.put("Year",2017);
map5.put("Month",2);
map5.put("Cost",500);
list_map.add(map5);
Map<String,Integer> map6 = new HashMap<String,Integer>();
map6.put("Year",2017);
map6.put("Month",3);
map6.put("Cost",300);
list_map.add(map6);
Iterator<Map<String,Integer>> iterator = list_map.iterator();
while(iterator.hasNext())
{
Map<String,Integer> year = iterator.next();
Set<Entry<String,Integer>> entrySet = year.entrySet();
for(Entry<String, Integer> entry : entrySet)
{
System.out.println("Key : " + entry.getKey() +" " + "\tValue : " + entry.getValue());
}
System.out.println();
}
输出
Key : Month Value : 1
Key : Year Value : 2018
Key : Cost Value : 100
Key : Month Value : 2
Key : Year Value : 2018
Key : Cost Value : 200
Key : Month Value : 3
Key : Year Value : 2018
Key : Cost Value : 300
Key : Month Value : 1
Key : Year Value : 2017
Key : Cost Value : 400
Key : Month Value : 2
Key : Year Value : 2017
Key : Cost Value : 500
Key : Month Value : 3
Key : Year Value : 2017
Key : Cost Value : 300
预期产量
Year Count
2018 600
2017 1200
答案 0 :(得分:0)
我认为Andronicus的答案会很好。阿里·阿齐姆(Ali Azim)也是如此,但是我的变体更小。
Map<Integer,Integer> yearCounts = new HashMap<>();
for (Map<String, Integer> year : list_map) {
if (yearCounts.containsKey(year.get("Year"))) {
Integer count = yearCounts.get(year.get("Year"));
yearCounts.put(year.get("Year"), year.get("Cost") + count);
} else {
yearCounts.put(year.get("Year"), year.get("Cost"));
}
}
System.out.println("Year\tCount");
for (Map.Entry<Integer, Integer> yearCount : yearCounts.entrySet()) {
System.out.println(yearCount.getKey() + "\t" + yearCount.getValue());
}
答案 1 :(得分:0)
这是使用流的绝佳案例。
Map<Integer, Integer> yearStats = listMap.stream()
.collect(Collectors.groupingBy(t -> t.get("Year"), Collectors.summingInt(t -> t.get("Cost"))));
说明:
使用stream
方法,初始化流操作以便遍历流的元素。在这种情况下,每个元素都是一个Map
。然后,我们使用一个收集器,该收集器按地图的Year
键的值进行分组,因此它将为我们提供每年的结果。 Collector.groupingBy
方法的第二个参数允许我们传递另一个Collector
。我们传入summingInt
收集器,该收集器从添加所有元素的流中收集元素。
顺便问一句,您使用Map
而不是使用特定类是有原因的吗?
class A {
int year;
int month;
int cost;
}