Подкарта () поведения TreeMap при использовании компаратора - PullRequest
0 голосов
/ 04 июня 2018

Я работаю над 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, чтобы принятькомпаратор и попытался получить подкарту.

TreeMap<String, Integer> dept = new TreeMap<>(Comparator.reverseOrder());
SortedMap<String, Integer> subDept = dept.subMap("Training", "Sales\0");

Но я получаю результат как

Обучение -> 2 тестирования -> 1

, а не

Обучение -> 2 Тестирование -> 1 Продажа -> 6

Почему добавление \ 0 ко второму параметру подкарты не делает его закрытым диапазоном при использовании обращенного компаратора?Или я что-то упустил в коде?

1 Ответ

0 голосов
/ 04 июня 2018

При обратном порядке, "Sales\0" предшествует "Sales".

Добавление \0 - это хак, который работает только для строк и только для строк в лексикографическом порядке.В этом случае вам придется изменить строку на что-то, что лексикографически предшествует Sales, например, Saler.

Гораздо проще и надежнее будет использовать предоставленный метод для получения закрытогодиапазон:

dept.subMap("Training", true, "Sales", true)
...