简体   繁体   English

从java中的地图中检索有序列表

[英]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.comparingDoubleComparator.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM