按值对地图<键,值>进行排序

按值对地图<键,值>进行排序

我是Java的新手,经常发现我需要对Map<Key, Value>值进行排序。

由于值不是唯一的,我发现自己将其转换keySet为a array,并通过数组排序对该数组进行排序,并使用自定义比较器对与键关联的值进行排序。

有没有更简单的方法?


holdtom
浏览 704回答 3
3回答

喵喔喔

这是一个通用友好版本:public&nbsp;class&nbsp;MapUtil&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;<K,&nbsp;V&nbsp;extends&nbsp;Comparable<?&nbsp;super&nbsp;V>>&nbsp;Map<K,&nbsp;V>&nbsp;sortByValue(Map<K,&nbsp;V>&nbsp;map)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List<Entry<K,&nbsp;V>>&nbsp;list&nbsp;=&nbsp;new&nbsp;ArrayList<>(map.entrySet()); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list.sort(Entry.comparingByValue()); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Map<K,&nbsp;V>&nbsp;result&nbsp;=&nbsp;new&nbsp;LinkedHashMap<>(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(Entry<K,&nbsp;V>&nbsp;entry&nbsp;:&nbsp;list)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result.put(entry.getKey(),&nbsp;entry.getValue()); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;result; &nbsp;&nbsp;&nbsp;&nbsp;}}

HUX布斯

Java 8提供了一个新的答案:将条目转换为流,并使用Map.Entry中的比较器组合器:Stream<Map.Entry<K,V>> sorted =&nbsp; &nbsp; map.entrySet().stream()&nbsp; &nbsp; &nbsp; &nbsp;.sorted(Map.Entry.comparingByValue());这将允许您使用按值的升序排序的条目。如果要降序值,只需反转比较器:Stream<Map.Entry<K,V>> sorted =&nbsp; &nbsp; map.entrySet().stream()&nbsp; &nbsp; &nbsp; &nbsp;.sorted(Collections.reverseOrder(Map.Entry.comparingByValue()));如果值不具有可比性,则可以传递显式比较器:Stream<Map.Entry<K,V>> sorted =&nbsp; &nbsp; map.entrySet().stream()&nbsp; &nbsp; &nbsp; &nbsp;.sorted(Map.Entry.comparingByValue(comparator));然后,您可以继续使用其他流操作来使用数据。例如,如果您想要新地图中的前10名:Map<K,V> topTen =&nbsp; &nbsp; map.entrySet().stream()&nbsp; &nbsp; &nbsp; &nbsp;.sorted(Map.Entry.comparingByValue(Comparator.reverseOrder()))&nbsp; &nbsp; &nbsp; &nbsp;.limit(10)&nbsp; &nbsp; &nbsp; &nbsp;.collect(Collectors.toMap(&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e1, LinkedHashMap::new));或打印到System.out:map.entrySet().stream()&nbsp; &nbsp;.sorted(Map.Entry.comparingByValue())&nbsp; &nbsp;.forEach(System.out::println);
打开App,查看更多内容
随时随地看视频慕课网APP