我的两个列表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
这是您可以做到的一种方法。为了获得像您一样的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
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。