各ツリー ノードにデータが保持されるジェネリック ツリー クラスがあります。データの各部分には、String 型の属性が 1 つあります。この属性で、各ツリー ノードの子をアルファベット順に並べ替えたいと思います。
ツリー クラス:
public class Tree<T>{
public T data;
public List<Tree<T>> children = new ArrayList<Tree<T>>();
}
ツリーの子は Tree 型であることに注意してください!
Tree クラスの実際の型パラメーターの例は次のとおりです。
public class DataItem{
public String name;
}
私の考えは、 Tree クラスを sort() メソッドで拡張し、次のような Comparator を使用することですが、比較関数で立ち往生しています:
public class Tree<T>{
public T data;
public List<Tree<T>> children = new ArrayList<Tree<T>>();
public void sort(){
Collections.sort(this.children,
new Comparator<Tree<T>>(){
@Override
public int compare(Tree<T> objectA, Tree<T> objectB){
//I am stuck here!
return 0;
}
}
);
for(Tree<T> child: this.children){
child.sort();
}
}
}
この問題を解決するためのさまざまなアイデアがあります。
- リフレクションを使用してオブジェクトの属性にアクセスし、それらを比較します。
- DataItem にインターフェイス Comparable を実装します。
新しいインターフェースを使用して、比較のためにオブジェクトの属性にアクセスします。
public interface GetComparisonAttribute { public String getComparisonAttribute(); } public class DataItem implements GetComparisonAttribute{ public String name; @Override public String GetComparisonAttribute(){ return this.name; } } //the comparison function inside Tree<T>.sort(): public int compare(Tree<T> objectA, Tree<T> objectB){ return objectA.data.getComparisonAttribute() .compareToIgnoreCase(objectB.data.getComparisonAttribute()); }
何をするのが正しいか、または最善のことですか?他の方法はありますか?
ソート属性を指定できることが重要な場合があります。
Tree で Collections.sort() を直接使用するのはいいことだと思いますが、この再帰的なデータ構造に実装すると本当に混乱します。この方法の欠点は、並べ替え属性を指定できないことです。