【问题标题】:reverse sort of treeset with keeping sort on each level对树集进行反向排序,并在每个级别上保持排序
【发布时间】:2017-06-02 08:40:39
【问题描述】:

我刚刚学习收藏,我有一个任务。一些组织想要创建部门目录。部门代码是字符串数组:

    “K1\SK1”
    “K1\SK2”
    “K1\SK1\SSK1”
    “K1\SK1\SSK2”
    “K2”
    “K2\SK1\SSK1”
    “K2\SK1\SSK2” 

我需要对部门代码进行降序和升序排序并保持层次结构。如有必要,请添加带有更高级别部门代码的字符串,例如这里我们有带有 K1 的字符串,但我们没有分隔字符串“K1”。 排序后的结果必须是

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 中添加字符串时,它的 OK,自然排序会起作用并按升序排序。但是,当我尝试使用 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;
}

}

【问题讨论】:

    标签: java sorting collections tree treeset


    【解决方案1】:

    一种方法是创建一个部门类。这个 Department 类将有两个字段:

    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)
    }
    

    只有在启动每个对象之前有办法了解每个部门的相对层次结构时,这才有效。

    【讨论】:

      猜你喜欢
      • 2016-11-08
      • 2021-07-18
      • 2020-12-20
      • 1970-01-01
      • 2017-10-20
      • 1970-01-01
      • 1970-01-01
      • 2017-09-13
      • 1970-01-01
      相关资源
      最近更新 更多