【问题标题】:How to get keys of a LinkedHashMap sorted by their entry’s value?如何获取按条目值排序的 LinkedHashMap 的键?
【发布时间】:2021-07-28 06:07:45
【问题描述】:

在图中,我将节点与数量相关联:数量可能是冗余的,而节点不能,因此为了根据升序对数量进行排序,我将节点作为键和数量作为 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 中?

【问题讨论】:

  • 将键放入 ArrayList:new ArrayList&lt;&gt;(orderedResult.keySet())
  • 恐怕 keySet 不会返回正确的关联订单
  • 是的,orderedResult 映射中条目的插入顺序,这是值顺序,因为您在插入该映射之前按值排序。你真的明白那段代码在做什么吗,因为我已经说过了?!?
  • results.entrySet().sorted(comparingByValue()).map(Map.Entry::getKey).collect(toList())怎么样
  • 我实际上的意思是这段代码可以替换当前代码放入LinkedHashMap。如果您想要的只是排序键,那么这似乎没有必要。

标签: java sorting linkedhashmap


【解决方案1】:

如果您想要的只是按值排序的键,那么您可以将代码替换为:

List<Node> sortedNodes = 
    mapNameToSize
    .entrySet()
    .stream()
    .sorted(Map.Entry.comparingByValue())
    .map(Map.Entry::getKey)
    .collect(Collectors.toList())
;

【讨论】:

  • 请注意,如果需要可变性,则可能存在空条目,或者由于某些其他原因需要ArrayList 类型的结果,而任意List 可能不需要,最好收集具体到ArrayList,因为Collectors.toList 不保证结果列表的可变性。 .collect(Collectors.toCollection(ArrayList::new))
【解决方案2】:

ArrayList copy constructorLinkedHashMapkeySet 一起使用将返回一个ArrayList,其中元素的顺序与LinkedHashMap 的条目顺序相同:

List<Node> orderedKeys = new ArrayList<>(orderedResult.keySet())

正如another answer 中提到的,您也可以对流中的初始映射条目进行排序,并将其值收集到一个列表中。如果您只需要值,并且不需要LinkedHashMap,这是一个很好的解决方案。

但是,如果您已经有一个有序的LinkedHashMap,并且您希望以与映射相同的顺序获取它的键,那么使用现有映射的键集可能比重新排序源更有意义并流式传输到列表。此外,即使LinkedHashMap 没有相应的比较顺序,这也可以工作(例如,它根据任意插入顺序进行排序,而流方法需要明确定义的比较操作..

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多