我只是学习收藏,我有一个任务。有些组织想要创建一个部门目录。部门代码是一系列字符串:
“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;
}
}
答案 0 :(得分: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)
}
只有在启动每个对象之前有办法知道每个部门的相对层次结构时,这才有效。