簡體   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