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

Bia*_*cki 52 java

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

eri*_*son 77

使用a 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());
}
Run Code Online (Sandbox Code Playgroud)

如果你与你喜欢的未分类其他Map实现工作,你可以将它传递给构造函数TreeMap建立与排序键新的地图.

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. */
  ... 
}
Run Code Online (Sandbox Code Playgroud)

A TreeMap可以使用任何类型的密钥来实现Comparable接口,将它们置于"自然"顺序中.对于不是Comparable或者其自然排序不是您需要的键,您可以实现自己的键Comparator并在构造函数中指定它.


Mic*_*ers 35

你有几个选择.按优先顺序列出:

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

最后两个将为您提供您想要的,但只有在您只想迭代一次然后忘记整个事情时才应该使用.


Pet*_*rey 8

您可以在迭代时创建已排序的集合,但首先有一个排序的映射更有意义.(正如已经建议的那样)

同样,这是你如何做到这一点.

Map<String, Object> map;
for(String key: new TreeSet<String>(map.keySet()) {
  // accessed in sorted order.
}
Run Code Online (Sandbox Code Playgroud)


Shr*_*yas 6

除了其他答案中提到的方法之外,对于 Java 8 流,从地图中获取排序键列表的另一种速记是 -

List<T> sortedKeys = myMap.keySet().stream().sorted().collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

实际上也可以在之后完成一些事情.sorted()(例如使用 a.map(...)或 a .forEach(...)),而不是将其收集在列表中然后遍历列表。