我必须获取最高平均温度的国家/地区名称。
我已经使用以下方法来获取平均温度
this.getTemperatures()
.stream()
.collect(Collectors.groupingBy(Temperature::getCountry,
Collectors.averagingDouble(Temperature::getAverageTemperature)))
如何从此平均温度列表中获取最大或最小平均国家/地区名称?
答案 0 :(得分:4)
我不太喜欢这样做,因为重复了很多代码,但是可以正常工作。在不使代码更糟的情况下,我无法找到避免重复的方法。
这还会对所有地图条目进行两次迭代,但是鉴于只有195个国家/地区,因此我们所讨论的最多是195次额外的迭代(如果您有每个指标的测量结果),那么对于一个中央处理器。
String max = countryToAvgTemp.entrySet().stream() //stream all entries
.max(Map.Entry.comparingByValue()) //get the max by comparing entry value
.map(Map.Entry::getKey) //grab the key
.orElseThrow(() -> new RuntimeException("No max")); //e.g. if the list is empty
String min = countryToAvgTemp.entrySet().stream()
.min(Map.Entry.comparingByValue())
.map(Map.Entry::getKey)
.orElseThrow(() -> new RuntimeException("No min"));
如果只想迭代一次,则可以编写自己的收集器,该收集器返回类似MinMax<String>
的内容。我写了一个,但是代码不是很好。最好保持简单。
答案 1 :(得分:1)
使用
Collections.min(temperatureMap.entrySet(), Comparator.comparingInt(Map.Entry::getValue)).getValue()
和
Collections.max(temperatureMap.entrySet(), Comparator.comparingInt(Map.Entry::getValue)).getValue()
答案 2 :(得分:1)
如果要获取最大或最小平均国家名称,可以对温度列表进行排序,然后获取第一个和最后一个元素。但是您的工作不需要排序列表,这不是一个好方法,@ Michael的方法是对你很好。
List<Temperature> temperatures = Arrays.asList(
new Temperature("a",10),
new Temperature("b",11),
new Temperature("c",12),
new Temperature("d",13),
new Temperature("e",14),
new Temperature("f",15),
new Temperature("g",16),
new Temperature("h",17));
temperatures = temperatures.stream().sorted(new Comparator<Temperature>() {
@Override
public int compare(Temperature o1, Temperature o2) {
return (int) (o1.getAverageTemperature() - o2.getAverageTemperature());
}
}).collect(Collectors.toList());
String min = temperatures.get(0).getCountry();
String max = temperatures.get(temperatures.size()-1).getCountry();
答案 3 :(得分:0)
您可以尝试DoubleSummaryStatistics:
this.getTemperatures()
.stream()
.collect(Collectors.groupingBy(Temperature::getCountry,
Collectors.summarizingDouble(Temperature::getAverageTemperature)));
这将返回一张地图:
Map<Country, DoubleSummaryStatistics>
因此,使用DoubleSummaryStatistics,您可以获取每个国家/地区的计数,总和,最小,最大,平均值