[英]Retrieving an ordered list from a map in java
let's assume I have a HasMap<String, Student>
, where Student
has a method double getAverage()
, is there a clever way to retrieve a List<String>
of keys from that Map
ordered by decreasing average?让我们假设我有一个
HasMap<String, Student>
,其中Student
有一个方法double getAverage()
,有没有一种聪明的方法可以从该Map
检索一个List<String>
键的List<String>
,按平均递减排序?
I was thinking about using streams for compactness, however this does not work:我正在考虑使用流来实现紧凑性,但这不起作用:
List<String> ordered = studentMap.entrySet().stream()
.sorted((e1, e2) -> e2.getValue().getAverage().compareTo(e1.getValue().getAverage()))
.map(Map.Entry::getKey)
.collect(Collectors.toList());
You could use Comparator.comparingDouble
and Comparator.reversed()
for this purpose:为此,您可以使用
Comparator.comparingDouble
和Comparator.reversed()
:
List<String> ordered = studentMap.entrySet().stream()
.sorted(Comparator.<Map.Entry<String, Student>>comparingDouble(e -> e.getValue().getAverage()).reversed())
.map(Map.Entry::getKey)
.collect(Collectors.toList());
If your .getAverage()
method indeed returns a double
, there is no .compareTo()
method.如果您的
.getAverage()
方法确实返回double
,则没有.compareTo()
方法。
Use this instead:改用这个:
.sorted((e1, e2) -> Double.compare(e2.getValue().getAverage(), e1.getValue().getAverage()))
If getAverage()
returns a primitive (double), you can't use compareTo
.如果
getAverage()
返回原始值(double),则不能使用compareTo
。 Use Double.compare
:使用
Double.compare
:
List<String> ordered = studentMap.entrySet().stream()
.sorted((e1, e2) -> Double.compare(e2.getValue().getAverage(),e1.getValue().getAverage()))
.map(Map.Entry::getKey)
.collect(Collectors.toList());
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.