在Java

时间:2015-09-09 13:28:52

标签: java arrays date

我有一个日期数组作为键和值(整数)的形式:

[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

我试图解决的方法是使用爆炸函数,然后尝试重新组合这些,但这似乎比我需要的更复杂。

6 个答案:

答案 0 :(得分:4)

您可以将groupingByYearMonth一起用作分类器:

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());
        }