Почему моя карта деревьев не сортируется?


Я использовал TreeMap, где ключ-это String, а значение-это тип Integer. Когда я вывожу объект Map, он не печатается в отсортированном порядке.

Вот код, который я использовал:

TreeMap<String, Integer> m = new TreeMap<String, Integer>();
m.put("Hello", 1);
m.put("world", 2);
m.put("Zertt", 5);
m.put("Hello", 1);
m.put("world", 2);
System.out.println("map : " + m);

Я ожидаю, что выходные данные будут отсортированы следующим образом:

Карта: {Hello=1, world=2, Zertt=5}

Но вместо этого я получаю следующее:

Карта: {Hello=1, Zertt=5, world=2}

5 8

5 ответов:

Естественный порядок Strings чувствителен к регистру, поэтому Z идет перед w (все прописные буквы идут перед всеми строчными буквами).

Использовать

TreeMap<String, Integer> m = new TreeMap<String, Integer>(String.CASE_INSENSITIVE_ORDER);

Для нечувствительного к регистру порядка.

Javadoc говорит:

Карта сортируется в соответствии с естественным порядком ееключей , или с помощью компаратора, предоставляемого во время создания карты, в зависимости от того, какой конструктор используется.

правка: ответ Эрана верен, порядок строк чувствителен к регистру по умолчанию.

Возможно, эта информация окажется полезной.

В классе TreeMap содержатся конструкторы:

  1. Карта деревьев ()

  2. TreeMap (Comparator comp)

  3. TreeMap (карта m)

  4. TreeMap (SortedMap sm)

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

Второй конструктор создает пустую коллекцию, элементы от которые будут отсортированы в соответствии с законом, который определен в компаратор передачи.

Третий конструктор создает древовидную карту на основе существующей карты.

Четвертый конструктор создает древовидную карту на основе существующей SortedMap, элементы, из которых будет отсортирована в соответствии с законом, передаваемые SortedMap.

Обратите внимание, что для сортировки используются ключи, а не значение.

Как было сказано ранее, естественный порядок строк чувствителен к регистру. Но, если вы хотите нечувствительный порядок, вы можете предоставить comparator в качестве параметра конструктора TreeMap:

Map<String, Integer> m = new TreeMap<String, Integer>(String.CASE_INSENSITIVE_ORDER);

P. s. обратите внимание, что при использовании case insentive ключи порядка будут также сравнивать insentive:

m.put("Hello", 1);
m.put("helLo", 6);

Результат равен 6, а ключ - Hello

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