2017-06-02 46 views
3

我只是学习集合,我有一个任务。有些组织希望创建一个部门编目。部门代码是字符串数组:反向排序的treeset与保持排序每个级别

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

我需要对部门代码降序排列和升序排列并保持层次结构。如有必要,可以将String添加到更高级别部门的代码中,例如这里我们有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中添加字符串时,它自然排序它工作和排序sodes升序。但是,当我尝试使用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; 
} 

}

回答

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

此,如果你有知道的办法只能工作在启动每个对象之前每个部门的相对层次结构。