按照值对Map<Key, Value>进行排序。

43 浏览
0 Comments

按照值对Map<Key, Value>进行排序。

我相对来说还是Java新手,常常需要按照Map<Key, Value>中的值进行排序。

由于这些值并不唯一,因此我需要将keySet转换为一个array,并通过自定义比较器按与键关联的值进行排序。

有更简单的方法吗?

admin 更改状态以发布 2023年5月23日
0
0 Comments

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个:

Map topTen =
    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);

0
0 Comments

这是一个通用版本:

public class MapUtil {
    public static > Map sortByValue(Map map) {
        List> list = new ArrayList<>(map.entrySet());
        list.sort(Entry.comparingByValue());
        Map result = new LinkedHashMap<>();
        for (Entry entry : list) {
            result.put(entry.getKey(), entry.getValue());
        }
        return result;
    }
}

0