如何获取按条目值排序的 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 没有相应的比较顺序,这也会起作用(例如,它根据任意插入顺序排序,而流方法需要明确定义的比较操作..