Подкарта () поведения TreeMap при использовании компаратора
Я работаю над TreeMap. Когда я запускаю этот кусок кода, он дает мне желаемый результат.
TreeMap<String, Integer> dept = new TreeMap<>();
dept.put("Testing", 1);
dept.put("Training", 2);
dept.put("Automation", 3);
dept.put("Web Development", 4);
dept.put("Progamming", 5);
dept.put("Sales", 6);
dept.put("Housekeeping", 7);
SortedMap<String, Integer> subDept = dept.subMap("Sales","Training\0");
subDept.forEach( (name, id) -> System.out.println(name + " -> " + id));
Результат: Продажи -> 6 Тестирование -> 1 Обучение -> 2
Теперь я изменил TreeMap на Comparator и попытался получить подкарту.
TreeMap<String, Integer> dept = new TreeMap<>(Comparator.reverseOrder());
SortedMap<String, Integer> subDept = dept.subMap("Training", "Sales\0");
Но я получаю результат как
Обучение -> 2 Тестирование -> 1
и не
Обучение -> 2 Тестирование -> 1 Продажа -> 6
Почему добавление \0 ко второму параметру подкарты не делает его закрытым диапазоном при использовании обращенного компаратора? Или я что-то упустил в коде?
1 ответ
С обратным порядком, "Sales\0"
приходит раньше "Sales"
,
Прикрепление \0
это хак, который работает только для строк и только для строк в лексикографическом порядке. Для этого случая вам нужно изменить строку на что-то, что предшествует лексикографически Sales
например, Saler
,
Гораздо проще и надежнее будет использовать предоставленный метод для получения закрытого диапазона:
dept.subMap("Training", true, "Sales", true)