从Java的映射中检索有序列表

3
假设我有一个 HasMap<String, Student>,其中 Student 有一个方法 double getAverage(),那么是否有一种聪明的方法来检索按平均值递减排序的该 Map 的键的 List<String>
我考虑使用流使代码更简洁,但是这样做不行:
List<String> ordered  = studentMap.entrySet().stream()
                .sorted((e1, e2) -> e2.getValue().getAverage().compareTo(e1.getValue().getAverage()))
                .map(Map.Entry::getKey)
                .collect(Collectors.toList());

你能更具体地说明在Hashmap中哪个是键,哪个是值吗? - Aris2World
3个回答

5
您可以使用 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());

2
不幸的是,有限的类型推断在这种写法下会出现问题。您可以将其编写为Collections.reverseOrder(Comparator.comparingDouble(e -> e.getValue().getAverage()))或者简单地编写为Comparator.comparingDouble(e -> -e.getValue().getAverage()),与int值不同,当比较double时,否定运算符起作用(假设NaN在此处不相关)。 - Holger
@Holger 感谢您的留言。在我看来,通过简单地指定 comparingDouble 的类型参数来修复此问题会更容易一些。(已在帖子中修复) - fabian

3
如果你的.getAverage()方法确实返回一个double,那么就没有.compareTo()方法。
请使用以下代码代替:
.sorted((e1, e2) -> Double.compare(e2.getValue().getAverage(), e1.getValue().getAverage()))

2
如果getAverage()返回一个基本类型(double),你不能使用compareTo。请使用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());

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接