这是一个非常基本的问题,我对Java不太满意。我有一个Map,我想按排序顺序获取一个列表或一些键,所以我可以迭代它们。
答案 0 :(得分:74)
使用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
的{{3}}以创建带有排序键的新地图。
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
或其自然排序不是您所需的密钥,您可以实施自己的constructor并在Comparator
中指定。
答案 1 :(得分:33)
您有几种选择。按优先顺序列出:
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);
最后两个会得到你想要的东西,但只有在你只想迭代一次然后忘记整个事情时才能使用。
答案 2 :(得分:8)
您可以在迭代时创建已排序的集合,但首先有一个有序映射更有意义。 (正如已经建议的那样)
同样,这就是你如何做到的。
Map<String, Object> map;
for(String key: new TreeSet<String>(map.keySet()) {
// accessed in sorted order.
}
答案 3 :(得分:1)
除了其他答案中提到的方法外,对于Java 8流,从映射中获取排序后的键列表的另一个简写是-
'php /var/www/html/xxx.php backup'
一个人实际上也可以在List<T> sortedKeys = myMap.keySet().stream().sorted().collect(Collectors.toList());
之后完成工作(例如使用.sorted()
或.map(...)
),而不是将其收集在列表中,然后遍历列表。