2017-06-02 8 views
3

私はただコレクションを学習しています。一部の組織は部署のカタログを作成したいと考えています。部署のコードは、文字列の配列です:各レベルでソートを維持しながらツリーセットを逆順に並べ替え

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

私はdescendignと昇順部門のコードを並べ替えると階層を維持する必要があります。必要に応じて、レベルの高い部署のコードを含む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の文字列を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; 
} 

}

答えて

1

一つの方法は、部門のクラスを作成することです。あなたが知る方法を持っている場合にのみ動作することができます

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

:今、あなたは2個のコンパレータを作成することができます

String name; int hierarchy;

:この部門のクラスには、二つのフィールドを持っているでしょう各オブジェクトを開始する前に、各部門の相対的な階層。

関連する問題