如何在Java中对Map的键进行排序?

时间:2009-02-20 21:57:35

标签: java

这是一个非常基本的问题,我对Java不太满意。我有一个Map,我想按排序顺序获取一个列表或一些键,所以我可以迭代它们。

4 个答案:

答案 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)

您有几种选择。按优先顺序列出:

  1. 使用SortedMap
    SortedMap<whatever> myNewMap = new TreeMap<whatever>(myOldMap);
    如果您想多次迭代,这是非常可取的。它使键保持排序,因此您无需在迭代之前对它们进行排序。
  2. 没有#2。
  3. 也没有#3。
  4. SortedSet<whatever> keys = new TreeSet<whatever>(myMap.keySet());
  5. List<whatever> keys = new ArrayList<whatever>(myMap.keySet()); Collections.sort(keys);
  6. 最后两个会得到你想要的东西,但只有在你只想迭代一次然后忘记整个事情时才能使用。

答案 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(...)),而不是将其收集在列表中,然后遍历列表。