我正在尝试对地图进行排序以在下拉列表中显示。但我无法完成任何排序。这将返回一张新地图。但不是像我期望的那样用按键排序的地图。
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并转换该值将产生预期结果。
答案 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)
);