обратный вид набора деревьев с сохранением сортировки на каждом уровне

Я только изучаю коллекции, и у меня есть задача. Некоторая организация хочет создать каталог отделов. Коды отделов представляют собой массив строк:

    “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;
}

}


person mironec    schedule 02.06.2017    source источник


Ответы (1)


Один из способов сделать это — создать класс отдела. Этот класс отдела будет иметь два поля:

String name; int hierarchy;

Теперь вы можете создать два компаратора:

Comparator<Department> sortDescending = (d1, d2) -> {
    if(d1.hierarchy != d2.hierarchy)
        return Integer.compare(d2,d1)
    return String.compare(d2.name, d1.name)
}

а также

Comparator<Department> sortAscending = (d1, d2) -> {
    if(d1.hierarchy != d2.hierarchy)
        return Integer.compare(d2,d1)
    return String.compare(d1.name, d2.name)
}

Это может работать только в том случае, если у вас есть способ узнать относительную иерархию каждого отдела перед запуском каждого объекта.

person Ted Cassirer    schedule 02.06.2017