Почему моя карта деревьев не сортируется?
Я использовал 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 ответов:
Естественный порядок
String
s чувствителен к регистру, поэтомуZ
идет передw
(все прописные буквы идут перед всеми строчными буквами).Использовать
TreeMap<String, Integer> m = new TreeMap<String, Integer>(String.CASE_INSENSITIVE_ORDER);
Для нечувствительного к регистру порядка.
Javadoc говорит:
Карта сортируется в соответствии с естественным порядком ееключей , или с помощью компаратора, предоставляемого во время создания карты, в зависимости от того, какой конструктор используется.
правка: ответ Эрана верен, порядок строк чувствителен к регистру по умолчанию.
Возможно, эта информация окажется полезной.
В классе TreeMap содержатся конструкторы:
Карта деревьев ()
TreeMap (Comparator comp)
TreeMap (карта m)
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