1

私はクラスがある学校の課題をいくつか持っていますがBTree<E>、今はBSTree<E>クラスを拡張する必要がありますBTree<E>。はBSTreeソートされている必要がありBTreeます。

教師はComparator、必要な属性ですべての要素を並べ替えることができる static を使用することをお勧めしました。彼は参考になるコードをいくつか教えてくれましたが、クラスで静的ジェネリック変数を使用する方法がよくわかりません。static が何をするかは知っていますが、問題を回避する方法がわかりません。

これが私のコードです:

public class BSTree<E> extends BTree<E>{

    List<E> duplicates;
    static Comparator<E> comp = new NasComparator<E>();

    private static class NasComparator<E extends Comparable> implements Comparator<E>{
        @Override
        public int compare(E o1, E o2){
            return o1.compareTo(o2);
        }
    }
}
4

2 に答える 2

2

本題とは少しずれますが、一見の価値はあると思います。

あなたのコンパレータは単に役に立たない。通常、比較対象のオブジェクトが Comparable でないか、デフォルトの比較が用途に合わないため、 Comparator が必要です。

ただし、 E extends Comparable の制限を持つ Comparator を単純に作成し、比較ロジックが単純return a.compareTo(b)である場合、単純に直接比較しないのはなぜですか? 何かのようなもの

public class BSTree<E extends Comparable> extends BTree<E>{
}

あなたの並べ替えは単に Comparable#compareTo メソッドを利用するだけです。

オプションで Comparator をユーザーに提供させたい場合は、TreeMap で行われている方法を参照してください。基本的な考え方は、コンパレータが提供されている場合はコンパレータを使用し、提供されていない場合はエントリを Comparable にキャストして比較を行うことです。


Comparator を使用することを主張する場合 (コメントで言及されていますが、その背後にある理由はわかりません)、要素を にComparableする必要があるため、この制限をジェネリック型パラメーターに入れる必要があります。 「Comparable」を比較する Comparator を作成するだけです。

public class BSTree<E extends Comparable> extends BTree<E>{

    static Comparator<Comparable> comp = new ComparableComparator();

    private static class ComparableComparator implements Comparator<Comparable>{
        @Override
        public int compare(Comparable o1, Comparable o2){
            return o1.compareTo(o2);
        }
    }
}

奇妙に見えますが、それがあなたが求めるものです。

于 2013-01-14T08:51:16.167 に答える
1

次の 2 つを定義しているため、コードは少し複雑ですE

  • BSTree<E>static 変数が使用する の1 つ:はインスタンス レベルでのみ認識され、静的コンテキストでは使用できcompないため、コンパイルできません。E
  • の 1 つNasComparator<E extends Comparable>、そのスコープはそのネストされたクラスのみです

私の理解では、リストに格納されているアイテムのプロパティに基づいてリストを並べ替えたいと考えています。そのための追加のクラスは必要なく、Comparator を使用できます。プロパティ フィールドに基づいてアイテムを並べ替えたいと想像してください。次のように実行できます。

class Item {
    String property;
}

BSTree<Item> tree = ...;
tree.sort(new Comparator<Item> () {
    public int compare(Item o1, Item o2) {
        //you should handle the null case
        return o1.property.compareTo(o2.property);
    }
}

BSTree では、提供されたコンパレータを使用して、その並べ替え操作を実装する必要があります。

これで、必要なときに再利用できるようにしたい場所ならどこでも、コンパレーターを静的変数として宣言できるようになりました。

于 2013-01-14T07:38:42.100 に答える