【问题标题】:Sort map by key string (where key is actually an integer)按键字符串排序映射(其中键实际上是一个整数)
【发布时间】:2015-10-17 13:17:23
【问题描述】:

我正在尝试对地图进行排序以显示在下拉列表中。但我无法完成任何排序。这将返回一个新地图。但不是我所期望的按键排序的地图。

private Map<String, String> mapInstrumentIDs = new TreeMap<>();

Map<Object, Object> val = mapInstrumentIDs
                    .entrySet()
                    .stream()
                    .sorted(Map.Entry.comparingByKey())
                    .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

我当然没有想到键实际上是一个整数。这意味着将其排序为字符串不会给我预期的结果(作为整数排序)。将键更改为整数并转换值将产生预期的结果。

【问题讨论】:

  • 您不需要对mapInstrumentIDs 进行排序。它是一个TreeMap,所以它隐式地按键对其条目进行排序。
  • 你能粘贴你的输入和你的预期输出吗?
  • 是什么让你认为 .collect() 返回的地图会被排序?

标签: java sorting java-8


【解决方案1】:

默认情况下,TreeMap 保证其元素将按键升序排序。

【讨论】:

    【解决方案2】:

    您应该将结果收集到一个保留其条目顺序的Map 实现中。 LinkedHashMap 会做:

    Map<String, String> sorted = mapInstrumentIDs.entrySet().stream()
        .sorted(Map.Entry.comparingByKey())
        .collect(toMap(
                Map.Entry::getKey, 
                Map.Entry::getValue, 
                (x,y)-> {throw new AssertionError();},
                LinkedHashMap::new
        ));
    

    【讨论】:

    • 当然,如果预期的订单是按键排序的,TreeMap会顺利保留订单。然后我们得到,OP 在尝试对已经排序的数据进行排序之前有什么......
    • 我怀疑这是提问者没有粘贴真实代码的情况,他实际上并没有使用TreeMap,或者他的TreeMap 使用的是Comparator,而不是自然排序。或者,也许他想避免 O(log(n)) 查找 TreeMap
    • 仍然,创建按自然顺序键排序的映射就像new TreeMap&lt;&gt;(oldMap) 一样简单,如果oldMap 恰好是具有不同顺序的SortedMap,则将类型转换插入Map(我怀疑)。是的,这个问题毫无意义……
    【解决方案3】:

    通常复制如下:

    private SortedMap<String, String> mapInstrumentIDs = new TreeMap<>();
    SortedMap<String, String> val = new TreeMap(mapInstrumentIDs);
    

    如果你想要一个键类型为Comparable&lt;?&gt;,值类型为Object的副本,你想将初始映射指定为TreeMap,并且不能使用标准收集器:

    SortedMap<Comparable, Object> val = mapInstrumentIDs
                    .entrySet()
                    .collect(TreeMap<Comparable, Object>::new,
                        (m, e) -> { m.put(e.getKey(), e.getValue()); return m; },
                        (m, m2) -> m.addAll(m2)
                    );
    

    【讨论】:

    • 不要reduce 用于可变数据结构!您要修改的TreeMap 不是标识值。将collect 用于Mutable reduction
    • @Holger 你是对的;改了,因为那是纯FP。
    猜你喜欢
    • 1970-01-01
    • 2013-10-30
    • 2017-05-13
    • 1970-01-01
    • 1970-01-01
    • 2022-01-06
    • 2013-03-14
    • 1970-01-01
    • 2022-01-27
    相关资源
    最近更新 更多