TreeMap как это сортируется

Как сортируется TreeMap? скажем, например, у вас есть следующая карта:

TreeMap<String, Integer> treemap = new TreeMap<>();
treemap.put("lol", 1);
treemap.put("Marc", 2);
treemap.put("Jesper", 3);

Iterator ittwo = treemap.entrySet().iterator();
    while (ittwo.hasNext()) {
    Map.Entry pairs = (Map.Entry)ittwo.next();
    System.out.println(pairs.getKey() + " = " + pairs.getValue());
    ittwo.remove();
}

Результат этого:

Jesper = 3
Marc = 2
lol = 1

Итак, если это не по алфавиту, что это тогда?


person Marc Rasmussen    schedule 30.11.2012    source источник


Ответы (4)


Он не только в алфавитном порядке, но и чувствителен к верхнему/нижнему регистру.

TreeMap<String, Integer> treemap = new TreeMap<String, Integer>();
treemap.put("Lol", 1);
treemap.put("Marc", 2);
treemap.put("Jesper", 3);
treemap.put("lol1", 1);
treemap.put("marc1", 2);
treemap.put("jesper1", 3);

Выход:

Jesper = 3
Lol = 1
Marc = 2
jesper1 = 3
lol1 = 1
marc1 = 2

Итак, если вам это не нужно, вы можете использовать свой собственный компаратор и сравнивать строку в нижнем регистре:

TreeMap<String, Integer> treemap = new TreeMap<String, Integer>(new Comparator<String>() {
    public int compare(String o1, String o2) {
        return o1.toLowerCase().compareTo(o2.toLowerCase());
    }
});
treemap.put("Lol", 1);
treemap.put("Marc", 2);
treemap.put("Jesper", 3);
treemap.put("lol1", 1);
treemap.put("marc1", 2);
treemap.put("jesper1", 3);

Выход:

Jesper = 3
jesper1 = 3
Lol = 1
lol1 = 1
Marc = 2
marc1 = 2
person kornero    schedule 30.11.2012
comment
Java 8: new TreeMap<>((o1, o2) -> o1.compareToIgnoreCase(o2)) - person Line; 28.11.2018
comment
Это не только прописные/строчные буквы, но и лексикографически. Так что лучше пройти компаратор. - person Neil; 16.02.2019

Как указано в JavaDoc a TreeMap ". .. отсортирован в соответствии с естественным порядком его ключей..." (выделено мной).

Таким образом, ваш результат верен, учитывая, что нижний регистр l после верхнего регистра M в «алфавите» UTF.

Если вы хотите переопределить поведение по умолчанию, вы можете указать Comparator в конструкторе TreeMap.

person Anders R. Bystrup    schedule 30.11.2012

на самом деле вы получаете правильный вывод.

J(uppercase J)>M(uppercase M)>l(lowercase l). 

заглавные буквы лекскографически больше строчных букв

person PermGenError    schedule 30.11.2012

Поскольку вы не передавали Comparator через конструктор, это создаст новый TreeMap, используя естественный порядок его ключей.

В Java естественный порядок означает lexicographical порядок.

person Subhrajyoti Majumder    schedule 30.11.2012