如何获取按条目值排序的 LinkedHashMap 的键?
How to get keys of a LinkedHashMap sorted by their entry’s value?
在图中,我将一个节点与一个数量相关联:数量可能是多余的而节点不能,所以为了根据递增的数量进行排序,我将节点作为键,将数量作为 LinkedHashMap 的值并对其进行排序如下:
LinkedHashMap<Node, Integer> orderedResult = mapNameToSize.entrySet()
.stream()
.sorted(Map.Entry.comparingByValue())
.collect(Collectors.toMap(
Map.Entry::getKey,
Map.Entry::getValue,
(oldValue, newValue) -> oldValue, LinkedHashMap::new));
但我的问题是如何将键相应地排序到 ArrayList 中?
如果您只需要按值顺序排列的键,那么您可以将代码替换为:
List<Node> sortedNodes =
mapNameToSize
.entrySet()
.stream()
.sorted(Map.Entry.comparingByValue())
.map(Map.Entry::getKey)
.collect(Collectors.toList())
;
使用 ArrayList
copy constructor with the LinkedHashMap
's keySet 将 return 一个 ArrayList
其元素的顺序与 LinkedHashMap
的条目相同:
List<Node> orderedKeys = new ArrayList<>(orderedResult.keySet())
如 中所述,您也可以在流中对初始映射的条目进行排序,并将其值收集到列表中。如果您只需要值,并且不需要 LinkedHashMap
.
,那么这是一个很好的解决方案
但是,如果您已经有一个有序的 LinkedHashMap
并且您希望以与地图相同的顺序获取它的键,那么使用现有地图的键集可能比重新创建更有意义- 对源和流进行排序到列表。此外,即使 LinkedHashMap
没有相应的比较顺序,这也会起作用(例如,它根据任意插入顺序排序,而流方法需要明确定义的比较操作..
在图中,我将一个节点与一个数量相关联:数量可能是多余的而节点不能,所以为了根据递增的数量进行排序,我将节点作为键,将数量作为 LinkedHashMap 的值并对其进行排序如下:
LinkedHashMap<Node, Integer> orderedResult = mapNameToSize.entrySet()
.stream()
.sorted(Map.Entry.comparingByValue())
.collect(Collectors.toMap(
Map.Entry::getKey,
Map.Entry::getValue,
(oldValue, newValue) -> oldValue, LinkedHashMap::new));
但我的问题是如何将键相应地排序到 ArrayList 中?
如果您只需要按值顺序排列的键,那么您可以将代码替换为:
List<Node> sortedNodes =
mapNameToSize
.entrySet()
.stream()
.sorted(Map.Entry.comparingByValue())
.map(Map.Entry::getKey)
.collect(Collectors.toList())
;
使用 ArrayList
copy constructor with the LinkedHashMap
's keySet 将 return 一个 ArrayList
其元素的顺序与 LinkedHashMap
的条目相同:
List<Node> orderedKeys = new ArrayList<>(orderedResult.keySet())
如 LinkedHashMap
.
但是,如果您已经有一个有序的 LinkedHashMap
并且您希望以与地图相同的顺序获取它的键,那么使用现有地图的键集可能比重新创建更有意义- 对源和流进行排序到列表。此外,即使 LinkedHashMap
没有相应的比较顺序,这也会起作用(例如,它根据任意插入顺序排序,而流方法需要明确定义的比较操作..