Подкарта () поведения 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)
Другие вопросы по тегам