Вопрос-ответ

How can I sort Map values by key in Java?

Как я могу отсортировать значения карты по ключу в Java?

У меня есть карта, в которой есть строки как для ключей, так и для значений.

Данные выглядят следующим образом:


"вопрос1", "1"
"вопрос9", "1"
"вопрос2", "4"
"вопрос5", "2"


Я хочу отсортировать карту на основе ее ключей. Итак, в итоге у меня будет question1, question2, question3, и так далее.

В конце концов, я пытаюсь получить две строки из этой карты:


  • Первая строка: вопросы (в порядке 1 .. 10)

  • Вторая строка: ответы (в том же порядке, что и вопрос)

Прямо сейчас у меня есть следующее:

Iterator it = paramMap.entrySet().iterator();
while (it.hasNext()) {
Map.Entry pairs = (Map.Entry) it.next();
questionAnswers += pairs.getKey() + ",";
}

Это возвращает мне вопросы в виде строки, но они расположены не по порядку.

Переведено автоматически
Ответ 1

Краткий ответ

Используйте a TreeMap. Именно для этого он и предназначен.

Если эта карта передана вам и вы не можете определить тип, то вы можете сделать следующее:

SortedSet<String> keys = new TreeSet<>(map.keySet());
for (String key : keys) {
String value = map.get(key);
// do something
}

Это приведет к повторению по карте в естественном порядке следования ключей.


Более длинный ответ

Технически вы можете использовать все, что реализует SortedMap, но, за исключением редких случаев, это равносильно TreeMap, точно так же, как использование Map реализации обычно равно HashMap.

Для случаев, когда ваши ключи представляют собой сложный тип, который не реализует Comparable, или вы не хотите использовать естественный порядок, тогда TreeMap и TreeSet есть дополнительные конструкторы, которые позволяют передавать в Comparator:

// placed inline for the demonstration, but doesn't have to be a lambda expression
Comparator<Foo> comparator = (Foo o1, Foo o2) -> {
...
}

SortedSet<Foo> keys = new TreeSet<>(comparator);
keys.addAll(map.keySet());

Помните при использовании TreeMap or TreeSet, что его характеристики производительности будут отличаться от HashMap or HashSet. Грубо говоря, операции, которые находят или вставляют элемент, будут переходить от O (1) к O (Log (N)).

В a HashMap переход от 1000 элементов к 10000 на самом деле не влияет на время поиска элемента, но для a TreeMap время поиска будет примерно в 1,3 раза медленнее (при условии, что Log2). Переход от 1000 к 100 000 будет примерно в 1,6 раза медленнее при поиске каждого элемента.

Ответ 2

Предполагая, что TreeMap вам не подходит (и предполагая, что вы не можете использовать generics):

List sortedKeys=new ArrayList(yourMap.keySet());
Collections.sort(sortedKeys);
// Do what you need with sortedKeys.
Ответ 3

Используя TreeMap, вы можете отсортировать карту.

Map<String, String> map = new HashMap<>();        
Map<String, String> treeMap = new TreeMap<>(map);
for (String str : treeMap.keySet()) {
System.out.println(str);
}
Ответ 4

Просто используйте TreeMap:

new TreeMap<String, String>(unsortMap);

Имейте в виду, что древовидная карта сортируется в соответствии с естественным порядком ее "ключей".

java