Это очень простой вопрос, я просто не так хорош с Java. У меня есть карта, и я хочу получить список или что-то из ключей в отсортированном порядке, чтобы я мог перебирать их.
Как я могу сортировать ключи карты в Java?
Ответ 1
Используйте TreeMap
, который является реализацией интерфейса SortedMap
. Он представляет свои ключи в отсортированном порядке.
Map<String, Object> map = new TreeMap<String, Object>();
/* Add entries to the map in any order. */
...
/* Now, iterate over the map contents, sorted by key. */
for (Map.Entry<String, ?> entry : map.entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}
Если вы работаете с другой реализацией карты, которая не сортируется по своему усмотрению, вы можете передать ее в конструктор 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. */
...
}
A TreeMap
работает с любым типом ключа, который реализует интерфейс Comparable
, помещая их в свой "естественный" порядок. Для ключей, которые не являются Comparable
, или чей естественный порядок не то, что вам нужно, вы можете реализовать свой собственный Comparator
и указать что в конструкторе .
Ответ 2
У вас есть несколько вариантов. Перечислено в порядке предпочтения:
- Используйте
SortedMap
:SortedMap<whatever> myNewMap = new TreeMap<whatever>(myOldMap);
Это намного предпочтительнее, если вы хотите повторять несколько раз. Он держит ключи отсортированными, поэтому вам не нужно сортировать их перед итерацией. - Нет # 2.
- Нет и # 3.
-
SortedSet<whatever> keys = new TreeSet<whatever>(myMap.keySet());
-
List<whatever> keys = new ArrayList<whatever>(myMap.keySet()); Collections.sort(keys);
Последние два будут получать то, что вы хотите, но должны использоваться только в том случае, если вы хотите только один раз итерации, а затем забудьте все это.
Ответ 3
Вы можете создать отсортированную коллекцию при повторении, но имеет смысл иметь отсортированную карту в первую очередь. (Как уже было предложено)
Все равно, вот как вы это делаете.
Map<String, Object> map;
for(String key: new TreeSet<String>(map.keySet()) {
// accessed in sorted order.
}