2017-06-02 77 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) 
} 

此,如果你有知道的辦法只能工作在啓動每個對象之前每個部門的相對層次結構。