按键字符串排序映射(其中键实际上是一个整数)

时间:2015-07-27 11:16:01

标签: java sorting java-8

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

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));

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

3 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:3)

您应该将结果收集到保留其条目顺序的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
    ));

答案 2 :(得分:0)

通常人们可以复制为:

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

如果您想要一个密钥类型为Comparable<?>且值类型为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)
                );