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

Mar*_*arc 3 java collections java-stream

让我们假设我有一个HasMap<String, Student>,其中Student有一个方法double getAverage(),是否有一种聪明的方法可以List<String>Map按平均递减顺序排序的键中检索一个键?

我正在考虑使用流来实现紧凑性,但这不起作用:

List<String> ordered  = studentMap.entrySet().stream()
                .sorted((e1, e2) -> e2.getValue().getAverage().compareTo(e1.getValue().getAverage()))
                .map(Map.Entry::getKey)
                .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

fab*_*ian 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());
Run Code Online (Sandbox Code Playgroud)

  • 不幸的是,以这种方式编写时,有限的类型推断会导致问题。你可以把它写成 `Collections.reverseOrder(Comparator.comparingDouble(e -&gt; e.getValue().getAverage()))` 或者简单地写成 `Comparator.comparingDouble(e -&gt; -e.getValue().getAverage() )`,与 `int` 值不同,否定在比较 `double` 时起作用(假设 `NaN` 在这里不相关)。 (2认同)