Как отсортировать карту в Java - PullRequest
2 голосов
/ 25 мая 2010

я хочу отсортировать карту по значению ключа Пожалуйста, см. код ниже

public static void main(String[] args) {

    SortedMap map = new TreeMap();

    // Add some elements:
    map.put("2", "Two");
    map.put("1", "One");
    map.put("5", "Five");
    map.put("4", "Four");
    map.put("3", "Three");
    map.put("10", "Ten");
    map.put("12", "Twelve");
    map.put("7", "Seven");
    map.put("9", "Nine");

    Iterator iterator = map.keySet().iterator();
    while (iterator.hasNext()) {
        Object key = iterator.next();
        System.out.println("key : " + key + " value :" + map.get(key));
    }


}

 Result Should come below

key : 1 value :One
key : 2 value :Two
key : 3 value :Three
key : 4 value :Four
key : 5 value :Five
key : 7 value :Seven
key : 9 value :Nine
key : 10 value :Ten
key : 12 value :Twelve

Ответы [ 3 ]

10 голосов
/ 25 мая 2010

Полагаю, ваша проблема в том, что ключи "10" и "12" идут перед "2" (кстати, вам следует более конкретно рассказать о вашей проблеме в следующий раз) Это просто из-за способа сортировки строк.

Если вы хотите, чтобы ключи сортировались по их целочисленным значениям, у вас есть следующие опции:

  • используйте Integer ключи вместо String s
  • вставьте начальные нули в строковые ключи, чтобы сделать их одинаково длинными, т.е. "01" вместо "1" и т. Д.
  • используйте специальный Comparator, который сортирует по вашему желанию.
4 голосов
/ 25 мая 2010

A TreeMap - это SortedMap, который сортирует по ключам. То, как вы его использовали, у вас есть String ключей, и его естественное упорядочение лексикографическое, где "11" < "2".

Вот иллюстрация, использующая List для упрощения:

List<String> list = new ArrayList<String>(
    Arrays.asList("2", "1", "11", "b", "a", "aa")
);
Collections.sort(list);
System.out.println(list); // prints "[1, 11, 2, a, aa, b]"

Обратите внимание на аналогию между 1, 11, 2 и a, aa, b. Это именно то, что предписывает лексикографическое упорядочение. В словаре вы ожидаете, что aa появится до b. Аналогично, в этом порядке вы ожидаете, что 11 появится до 2.

Смотри также


Если вам нужно сравнить их как Integer, используйте пользовательский Comparator<String>:

Comparator<String> stringAsInteger = new Comparator<String>() {
    @Override public int compare(String s1, String s2) {
        return Integer.valueOf(s1).compareTo(Integer.valueOf(s2));
    }
};
List<String> list = new ArrayList<String>(
    Arrays.asList("2", "1", "10", "007")
);
Collections.sort(list, stringAsInteger);
System.out.println(list); // prints "[1, 2, 007, 10]"

SortedMap<String, String> map = new TreeMap<String, String>(stringAsInteger);
map.put("2", "Two");
map.put("1", "One");
map.put("10", "Ten");
map.put("12", "Twelve");
map.put("7", "Seven");
System.out.println(map); // prints "{1=One, 2=Two, 7=Seven, 10=Ten, 12=Twelve}"

API ссылки

Смежные вопросы

Вкл. Comparator и Comparable

При сортировке Map по значениям


По сырым видам

Effective Java 2nd Edition, Item 23: Не используйте необработанные типы в новом коде

Смежные вопросы

4 голосов
/ 25 мая 2010

Реализуйте собственный компаратор и создайте TreeMap с помощью этого маленького помощника. Компаратор обеспечивает порядок ("1" <"2" <"3" <... <"10" <... <"100"). </p>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...