在Java 8中按值对HashMap进行排序

4

我有一个HashMap需要按值排序,而且我想尽量简洁,所以我使用了Java 8。然而,各种方法都无法正常工作,我不确定为什么。我试过这个:

followLikeCount.values()
  .stream()
  .sorted(Map.Entry.comparingByValue())
  .collect(Collectors.toList());

这会抛出编译时异常:

Main.java:65: error: no suitable method found for sorted(Comparator<Entry<Object,V#1>>)
  .sorted(Map.Entry.comparingByValue())

我看不出为什么会有观察上的不匹配。我还尝试使用比较器:

Comparator<Map.Entry<Integer, Integer>> byValue =
          Map.Entry.<Integer, Integer>comparingByValue();

这会导致类似的错误。请问您能否说明为什么比较器无效?


values() 方法返回的是键值对还是仅仅是值? - markspace
啊,只需要值,但我不能直接将HashMap followLikeCount转换为流。是否需要完全不同的方法? - Bryn
1
尝试使用 entrySet()。您可以对集合进行流处理。 - markspace
Map还有一个名为 entrySet() 的方法,返回一个 Set<Map.Entry<K,V>> - Thomas Kläger
啊,太好了。因为期望只有值部分的比较器,所以比较器编译时错误。谢谢! - Bryn
1个回答

7
您尝试在由values()返回的List<Integer>上使用Comparator<Map.Entry<Integer, Integer>>
followLikeCount.values()
   .stream()
   .sorted(Map.Entry.comparingByValue())
   .collect(Collectors.toList());

你需要在一个由entrySet()返回的Set<Map.Entry<Integer, Integer>>上使用这个比较器:
List<Map.Entry<Integer, Integer>> list = followLikeCount.entrySet()
                                                    .stream()
                                                    .sorted(Map.Entry.comparingByValue())
                                                    .collect(Collectors.toList());

如果你只想获取已排序的数值,可以更改 Comparator 并返回一个 List<Integer>

List<Integer> list = followLikeCount.values()
            .stream()
            .sorted(Comparator.naturalOrder())
            .collect(Collectors.toList());

1
如果你只想获取排序后的(Comparable)值,你甚至可以使用比较器来实现:followLikeCount.values().stream().sorted().collect(Collectors.toList());。或者不使用流:List<Integer> list = new ArrayList<>(followLikeCount.values()); list.sort(null); - Holger

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