Я только изучаю коллекции, и у меня есть задача. Некоторая организация хочет создать каталог отделов. Коды отделов представляют собой массив строк:
“K1\SK1”
“K1\SK2”
“K1\SK1\SSK1”
“K1\SK1\SSK2”
“K2”
“K2\SK1\SSK1”
“K2\SK1\SSK2”
Мне нужно отсортировать коды отделов по убыванию и возрастанию и сохранить иерархию. При необходимости добавьте строку с кодом отделов более высокого уровня, например здесь у нас есть строки с К1, но у нас нет отдельной строки "К1". После сортировки результат должен быть
ascending sort:
“K1”
“K1\SK1”
“K1\SK1\SSK1”
“K1\SK1\SSK2”
“K1\SK2”
“K2”
“K2\SK1”
“K2\SK1\SSK1”
“K2\SK1\SSK2”
descending sort:
“K2”
“K2\SK1”
“K2\SK1\SSK2”
“K2\SK2\SSK1”
“K1”
“K1\SK2”
“K1\SK1”
“K1\SK1\SSK2”
“K1\SK1\SSK1”
И вопрос в том, как сортировать отделы по убыванию с сохранением иерархии? Когда я добавляю строки в TreeSet, это нормально, естественная сортировка работает и сортирует коды по возрастанию. Но когда я пытаюсь сортировать по убыванию с помощью Comparator, он сортирует без сохранения иерархии, как и ожидалось. Как я думаю, мне нужно идти по дереву справа налево по родительским узлам. Но как это сделать? Вот мой код:
public class SortDepartment {
/**
* Adds departments and sorts it in natural sorting in set
* @param departments
* @return
*/
public Set<String> addDepartmentIfNecessaryAndSortAscending(List<String> departments){
Set<String> result = new TreeSet<>();
String temp;
for(int i = 0; i < departments.size(); i++) {
if(departments.get(i).contains("\\")) {
temp = departments.get(i).substring(0, departments.get(i).lastIndexOf("\\"));
result.add(temp);
}
result.add(departments.get(i));
}
return result;
}
/**
* Sorts departments descending
* @param departments
*/
public Set<String> sortDepartmentDescending(Set<String> departments){
Set<String> result = new TreeSet<>(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o2.compareTo(o1);
}
});
result.addAll(departments);
return result;
}
}