Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 对树集进行反向排序,并在每个级别上保持排序_Java_Sorting_Collections_Tree_Treeset - Fatal编程技术网

Java 对树集进行反向排序,并在每个级别上保持排序

Java 对树集进行反向排序,并在每个级别上保持排序,java,sorting,collections,tree,treeset,Java,Sorting,Collections,Tree,Treeset,我只是在学习收藏,我有一个任务。某些组织希望创建部门目录。部门代码是字符串数组: “K1\SK1” “K1\SK2” “K1\SK1\SSK1” “K1\SK1\SSK2” “K2” “K2\SK1\SSK1” “K2\SK1\SSK2” 我需要对各部门的代码进行排序、降序和升序,并保持层次结构。如有必要,添加带有更高级别部门代码的字符串,例如,这里有带K1的字符串,但没有单独的字符串“K1”。 排序后的结果必须是 ascending

我只是在学习收藏,我有一个任务。某些组织希望创建部门目录。部门代码是字符串数组:

    “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”
问题是,如何按照保持层次结构对部门进行降序排序? 当im在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;
}
公共类分类部门{
/**
*添加部门并按集合中的自然排序对其进行排序
*@param部门
*@返回
*/
公共设置添加部门(如有必要)和排序设置(列出部门){
设置结果=新树集();
字符串温度;
对于(int i=0;i

}一种方法是创建一个department类。此Department类将有两个字段:

字符串名;
int层次结构

现在,您可以创建两个比较器:

Comparator<Department> sortDescending = (d1, d2) -> {
    if(d1.hierarchy != d2.hierarchy)
        return Integer.compare(d2,d1)
    return String.compare(d2.name, d1.name)
}
比较器排序结果=(d1,d2)->{ if(d1.hierarchy!=d2.hierarchy) 返回整数。比较(d2,d1) 返回String.compare(d2.name,d1.name) }

比较器排序=(d1,d2)->{
if(d1.hierarchy!=d2.hierarchy)
返回整数。比较(d2,d1)
返回String.compare(d1.name,d2.name)
}
只有在启动每个对象之前,您有办法了解每个部门的相对层次结构,这才能起作用

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