开发者社区> 问答> 正文

将总和作为值放入哈希图中

我的两个列表list2,并filetemp有相同的长度,并包含日期和温度。列表中的一些元素如下所示:

[1946-01-12, 1946-01-12, 1946-01-12, 1946-01-13, 1946-01-13, 1946-01-13, 1946-01-14, 1946-01-14, 1946-01-14]
[-1.3, 0.3, -2.8, -6.2, -4.7, -4.3, -1.5, -0.2, -0.4]

我想将它们放在哈希表中,将日期作为键,将温度作为值。由于我有多个与每个日期相对应的温度值,因此我想对每一天的温度值求和(或尽可能计算出每一天的平均温度),以使地图中的每个日期都对应于该日期的平均温度。现在我的问题是我的地图看起来像:

1946-01-12: -2.8
1946-01-13: -4.3
1946-01-14: -0.4

因此,它不会返回例如1946-01-14日期的-1.5 +(-0.2)+(-0.4)的总和,而是返回该日期的最后一个温度。有谁知道如何修理它?

public Map<LocalDate, Double> avarageTemperatures(LocalDate dateFrom, LocalDate dateTo) {
    List<LocalDate> list2 = new ArrayList<>();
    for (Weather weather : weatherData) {
        list2.add(weather.getDateTime());
    }

    Map<LocalDate, Double> map = new HashMap<>();
    List<Double> filetemp = new ArrayList<>();
    for (Weather weather : weatherData) {
        filetemp.add(weather.getTemperature());
    }
    Double val= 0.0;
    for (int i=1; i<list2.size(); i++) {
        if(list2.get(i)==list2.get(i-1)) {
            val+= filetemp.get(i);
            map.put(list2.get(i), val);
        } else {
            val=filetemp.get(i);
            map.put(list2.get(i), val);
        }
    }

    Set<Map.Entry<LocalDate, Double>> entrySet = map.entrySet();
    for(Map.Entry<LocalDate,Double> entry : entrySet) {
        if(!entry.getKey().isAfter(dateTo) && !entry.getKey().isBefore(dateFrom)) {
            System.out.println(entry.getKey()+": "+(entry.getValue()));
        }
    }

    return map;
}

问题来源:Stack Overflow

展开
收起
montos 2020-03-27 12:48:31 318 0
1 条回答
写回答
取消 提交回答
  • 这是您可以做到的一种方法。为了获得像您一样的Weather对象列表,我们使用String数组和Double值数组创建Weather对象列表。从该列表中,我们仅使用Collectors#groupingBy进行收集,这使我们能够确定要分组的键(在本例中为LocalDate),而Collector用于将所有相关键值分组在一起,在本例中为Collectors# summingDouble,因为我们要对所有double值求和。

            String[] dates = {
                    "1946-01-12", "1946-01-12", "1946-01-12", "1946-01-13", "1946-01-13", "1946-01-13",
                    "1946-01-14", "1946-01-14", "1946-01-14"
            };
    
            double[] temperatures = {-1.3, 0.3, -2.8, -6.2, -4.7, -4.3, -1.5, -0.2, -0.4};
    
            class Weather {
    
                private final LocalDate date;
    
                private final double temperature;
    
                Weather(LocalDate date, double temperature) {
                    this.date = date;
                    this.temperature = temperature;
                }
    
                public LocalDate getDate() {
                    return date;
                }
    
                public double getTemperature() {
                    return temperature;
                }
            }
    
            List<Weather> weather = IntStream.range(0, dates.length)
                    .mapToObj(index -> new Weather(LocalDate.parse(dates[index]), temperatures[index]))
                    .collect(Collectors.toList());        
    
           Map<LocalDate, Double> temperaturesSum = weather.stream()
                    .collect(Collectors.groupingBy(Weather::getDate,
                            Collectors.summingDouble(Weather::getTemperature)));
    
            Map<LocalDate, Double> temperaturesAverage = weather.stream()
                    .collect(Collectors.groupingBy(Weather::getDate,
                            Collectors.averagingDouble(Weather::getTemperature)));
    
            System.out.println("sum: " + temperaturesSum);
            System.out.println("average: " + temperaturesAverage);
    

    输出量

    sum: {1946-01-12=-3.8, 1946-01-13=-15.2, 1946-01-14=-2.1}
    average: {1946-01-12=-1.2666666666666666, 1946-01-13=-5.066666666666666, 1946-01-14=-0.7000000000000001}
    

    回答来源:Stack Overflow

    2020-03-27 12:48:57
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载