3

各ツリー ノードにデータが保持されるジェネリック ツリー クラスがあります。データの各部分には、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() を直接使用するのはいいことだと思いますが、この再帰的なデータ構造に実装すると本当に混乱します。この方法の欠点は、並べ替え属性を指定できないことです。

4

2 に答える 2

1

これを試して:

public class Tree<T> {
    public T data;
    public List<Tree<T>> children = new ArrayList<Tree<T>>();
    private Class<T> type;

    public Tree(Class<T> t) {
        type = t;
    }

    public void sort(){
        Collections.sort(this.children,
            new Comparator<Tree<T>>(){
                @Override
                public int compare(Tree<T> objectA, Tree<T> objectB){
                if (type==DataItem.class)
                   {
                    DataItem diA = (DataItem) (objectA.data);
                    DataItem diB = (DataItem) (objectB.data);

                    return diA.name.compareTo(diB.name);
                    }
                  else
                    throw new IllegalArgumentException();

                }
            }
        );
        for(Tree<T> child: this.children){
            child.sort();
        }
    }

}

作成時に、クラス Tree の型 T を渡す必要があります。次に、好きなフィールドに従ってリストをダウンキャストしDataItemてソートできます。もちろん、 以外の他の型パラメータに対してもチェックできますDataItem

于 2013-09-10T09:16:59.720 に答える