我有一个日期数组作为键和值(整数)的形式:
[2015-07-14] => 40
[2015-07-15] => 5
[2015-07-16] => 8
[2015-07-17] => 0
[2015-07-18] => 0
[2015-07-19] => 0
[2015-07-20] => 0
[2015-07-21] => 0
[2015-07-22] => 0
[2015-07-23] => 0
[2015-07-24] => 0
[2015-07-25] => 0
[2015-07-26] => 0
[2015-07-27] => 0
[2015-07-28] => 0
[2015-07-29] => 0
[2015-07-30] => 0
[2015-07-31] => 0
[2015-08-01] => 0
[2015-08-02] => 1
[2015-08-03] => 1
[2015-08-04] => 2
[2015-08-05] => 1
用户可以选择startdate和enddate。
是否有一种快速简便的方法来组合这些日期并按月汇总值?在我的例子中,结果看起来应该像是:
[2015-07] => 53
[2015-08] => 5
我试图解决的方法是使用爆炸函数,然后尝试重新组合这些,但这似乎比我需要的更复杂。
答案 0 :(得分:4)
您可以将groupingBy
与YearMonth
一起用作分类器:
Map<LocalDate, Integer> dateValues = // ...
Map<YearMonth, Integer> res =
dateValues.entrySet()
.stream()
.collect(groupingBy(e -> YearMonth.from(e.getKey()),
summingInt(e -> e.getValue())));
答案 1 :(得分:3)
只要日期是唯一的,使用HashMap<String, Integer>
就可以了。
public static void main(String[] args) {
Map<String, Integer> dates = new HashMap<String, Integer>();
dates.put("2015-07-14", 40);
dates.put("2015-07-15", 8);
dates.put("2015-07-16", 0);
dates.put("2015-07-17", 0);
dates.put("2015-07-18", 0);
dates.put("2015-08-01", 1);
dates.put("2015-08-02", 1);
dates.put("2015-08-03", 2);
dates.put("2015-08-04", 1);
Map<String, Integer> result = new HashMap<String, Integer>();
for (Entry<String, Integer> entry : dates.entrySet()) {
String key = entry.getKey().split("-")[0] + "/" + entry.getKey().split("-")[1];
Integer value = entry.getValue();
Integer oldValue = result.get(key) != null ? result.get(key) : 0;
result.put(key, oldValue + value);
}
for (Entry<String, Integer> entry : result.entrySet()) {
System.out.println("Month " + entry.getKey() + "- Value = " + entry.getValue());
}
}
输出(对于我的示例数据)
Month 2015/08- Value = 5
Month 2015/07- Value = 48
答案 2 :(得分:0)
您可以添加如下值:
int[][] newarray = new int[latestyear][12];
for(int i = intitialyear; i<finalyear; i++) {
for(int j = 0; j<12; j++) { //no of months
int temp = 0;
for(int k = 0; k<numberofdaysintheparticularmonth; k++) {
temp = temp + yourcurrentarray[i][j][k];
}
newarray[i][j] = temp;
}
}
答案 3 :(得分:0)
使用地图。实例化为新的Map,然后循环遍历上面的集合。以yyy-MM格式格式化每个日期。这将是您的Map键。如果密钥不存在,则添加密钥。然后将它的值添加到Map项。这应该做到这一点。不是一个班轮,但它会做
答案 4 :(得分:0)
您可以使用Java 8 map reduce操作;特别是Collectors.grouping与Collectors.mapping一起使用。 https://docs.oracle.com/javase/tutorial/collections/streams/reduction.html
答案 5 :(得分:0)
Map<String,Integer> myMap = new HashMap<>();
myMap.put("2015-07-14", 50);
myMap.put("2015-07-15", 6);
myMap.put("2015-08-14", 2);
Map<String,Integer> result = new HashMap<>();
for (Map.Entry<String, Integer> entry : myMap.entrySet())
{
String date = entry.getKey().substring(0, entry.getKey().length()-3);
if(result.containsKey(date)){
int value = result.get(date);
value += entry.getValue();
result.put(date, value);
}
else{
result.put(date, entry.getValue());
}
}
for (Map.Entry<String, Integer> entry : result.entrySet())
{
System.out.println(entry.getKey() + " " + entry.getValue());
}