按照值对Map<Key, Value>进行排序。
按照值对Map<Key, Value>进行排序。
我相对来说还是Java新手,常常需要按照Map<Key, Value>
中的值进行排序。
由于这些值并不唯一,因此我需要将keySet
转换为一个array
,并通过自定义比较器按与键关联的值进行排序。
有更简单的方法吗?
admin 更改状态以发布 2023年5月23日
Java 8提供了一个新的解决方案:将Map的entry转换为流,并使用Map.Entry中的比较器组合器:
Stream> sorted = map.entrySet().stream() .sorted(Map.Entry.comparingByValue());
这将使您按值的升序排序消费entry。如果您想按值的降序排序,只需反转比较器:
Stream> sorted = map.entrySet().stream() .sorted(Collections.reverseOrder(Map.Entry.comparingByValue()));
如果这些值是不可比较的,您可以传递一个显式比较器:
Stream> sorted = map.entrySet().stream() .sorted(Map.Entry.comparingByValue(comparator));
然后,您可以继续使用其他流操作来消费数据。例如,如果您想在一个新的map中获取前10个:
MaptopTen = map.entrySet().stream() .sorted(Map.Entry.comparingByValue(Comparator.reverseOrder())) .limit(10) .collect(Collectors.toMap( Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e1, LinkedHashMap::new));
如上所示,LinkedHashMap
按插入顺序迭代entry。
或者打印到System.out
:
map.entrySet().stream() .sorted(Map.Entry.comparingByValue()) .forEach(System.out::println);