繁体   English   中英

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

[英]How can I sort the keys of a Map in Java?

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

使用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构造函数以创建具有已排序键的新映射。

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并在构造函数中指定它。

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

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

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

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

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

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(...) ),而不是在列表中收集然后迭代列表。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM