按值对映射<键、值>进行排序
2022-08-31 01:25:28
我对Java相对较新,经常发现我需要对值进行排序。Map<Key, Value>
由于这些值不是唯一的,我发现自己将 转换为 ,并使用自定义比较器通过数组排序对该数组进行排序,该比较器根据与键关联的值进行排序。keySet
array
有没有更简单的方法?
我对Java相对较新,经常发现我需要对值进行排序。Map<Key, Value>
由于这些值不是唯一的,我发现自己将 转换为 ,并使用自定义比较器通过数组排序对该数组进行排序,该比较器根据与键关联的值进行排序。keySet
array
有没有更简单的方法?
这是一个通用友好的版本:
public class MapUtil {
public static <K, V extends Comparable<? super V>> Map<K, V> sortByValue(Map<K, V> map) {
List<Entry<K, V>> list = new ArrayList<>(map.entrySet());
list.sort(Entry.comparingByValue());
Map<K, V> result = new LinkedHashMap<>();
for (Entry<K, V> entry : list) {
result.put(entry.getKey(), entry.getValue());
}
return result;
}
}
Java 8 提供了一个新的答案:将条目转换为流,并使用 Map.Entry 中的比较器组合器:
Stream<Map.Entry<K,V>> sorted =
map.entrySet().stream()
.sorted(Map.Entry.comparingByValue());
这将允许您使用按值的升序排序的条目。如果您想要降值,只需反转比较器:
Stream<Map.Entry<K,V>> sorted =
map.entrySet().stream()
.sorted(Collections.reverseOrder(Map.Entry.comparingByValue()));
如果这些值不具有可比性,则可以传递显式比较器:
Stream<Map.Entry<K,V>> sorted =
map.entrySet().stream()
.sorted(Map.Entry.comparingByValue(comparator));
然后,您可以继续使用其他流操作来使用数据。例如,如果您希望在新地图中显示前 10 名:
Map<K,V> 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
按照插入条目的顺序迭代条目。
或打印到:System.out
map.entrySet().stream()
.sorted(Map.Entry.comparingByValue())
.forEach(System.out::println);