【发布时间】:2018-11-16 18:17:08
【问题描述】:
这是一个非常基本的问题,我只是不太擅长 Java。我有一个 Map,我想按排序顺序获取一个列表或一些键,以便我可以遍历它们。
【问题讨论】:
标签: java
这是一个非常基本的问题,我只是不太擅长 Java。我有一个 Map,我想按排序顺序获取一个列表或一些键,以便我可以遍历它们。
【问题讨论】:
标签: java
使用TreeMap,它是SortedMap 接口的实现。它按排序顺序显示其键。
Map<String, Object> map = new TreeMap<String, Object>();
/* Add entries to the map in any order. */
...
/* Now, iterate over the map's contents, sorted by key. */
for (Map.Entry<String, ?> entry : map.entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}
如果您正在使用未按您喜欢的方式排序的另一个 Map 实现,您可以将它传递给 TreeMap 的 constructor 以创建具有排序键的新映射。
void process(Map<String, Object> original) {
Map<String, Object> copy = new TreeMap<String, Object>(original);
/* Now use "copy", which will have keys in sorted order. */
...
}
TreeMap 可与任何类型的实现 Comparable 接口的键配合使用,将它们置于“自然”顺序。对于不是Comparable 的键,或者其自然顺序不是您所需要的,您可以实现自己的Comparator 并在constructor 中指定。
【讨论】:
您有多种选择。按优先顺序列出:
SortedMap:SortedMap<whatever> myNewMap = new TreeMap<whatever>(myOldMap);SortedSet<whatever> keys = new TreeSet<whatever>(myMap.keySet());List<whatever> keys = new ArrayList<whatever>(myMap.keySet());
Collections.sort(keys); 最后两个会得到你想要的,但只有当你只想迭代一次然后忘记整个事情时才应该使用。
【讨论】:
您可以在迭代时创建一个排序集合,但首先拥有一个排序映射更有意义。 (正如已经建议的那样)
都一样,这就是你的做法。
Map<String, Object> map;
for(String key: new TreeSet<String>(map.keySet()) {
// accessed in sorted order.
}
【讨论】:
除了其他答案中提到的方法之外,对于 Java 8 流,从映射中获取排序键列表的另一种简写方式是 -
List<T> sortedKeys = myMap.keySet().stream().sorted().collect(Collectors.toList());
实际上也可以在.sorted() 之后完成工作(例如使用.map(...) 或.forEach(...)),而不是将其收集到列表中然后遍历列表。
【讨论】: