2

2 つのクラスがあり、どちらも int ID 属性を持ち、ID で並べ替えるには、この Comparator クラスを 2 回作成する必要があります。

public class Class1Comparator implements Comparator<Class1> {

/**
 * Comparator Constructor.
 */
public Class1Comparator() {
}

@Override
public int compare(Class1 arg0, Class1 arg1) {
    return arg0.getId() - arg1.getId();
}
}

まったく同じですが、Class1ではなくClass2で、すべてが機能しますが、それらを1つのクラスまたは何かにマージする方法はありますか?

4

5 に答える 5

3

の単一の実装とともに、共通の ID を含む基本クラスからClass1およびを派生させます。Class2Comparator<BaseClass>

例:

public class BaseClass
{
    private int id;

    //.
    //.
    //.

    public static class CmpID implements Comparator<BaseClass>
    {
        @Override
        public int compare(BaseClass a, BaseClass b) {
            //Could be implemented null safe
            return a.id - b.id;
        }
    }
}

編集:たとえば、共通のインターフェースを実装することもできます

public interface IdentifiableObject
{
    int getId();
}

と で使用されClass1ますClass2。ここでも、 の単一の実装でComparator<IdentifiableObject>十分です。

于 2013-03-10T10:00:35.577 に答える
1

実装するクラスが getId() メソッドを持つ必要があることを定義するインターフェイス GetId を作成します。クラスにインターフェイスを実装させてから、そのインターフェイスを実装する任意のクラスを引数として受け取るコンパレーターを作成します。

于 2013-03-10T10:09:27.877 に答える
0

Comparatorclassを別のより一般的な名前で呼び出し、に変更します。これにより、同じコンパレータを異なるクラスで使用できるようになります。

于 2013-03-10T10:06:48.137 に答える
0

2つの異なるクラスのインスタンスを比較しようとすると、同じクラスに属するオブジェクト間でのみ比較を実行できるため、ClassCastExceptionが発生するため、基本的に問題に対する適切な解決策はありません。1つの解決策は、 samが提案したように、あるクラスを別のクラスから拡張することです。

于 2013-03-10T10:11:41.943 に答える
0
  • クラスに共通の祖先がある場合は、それを使用して ID をフェッチし
    、比較を実行します。
  • 少し拡張します。リフレクションを使用して、各クラスの id 属性を取得できます。このソリューションは遅くなり、お勧めできません。
  • 共通の祖先がなく、コード ベースを制御できない場合は、うまくいきません。もちろん、それをさらに拡張し、動的プロキシを使用してJavaでダックタイピングをエミュレートすることもできますが、ROIはかなりスリムになります:)
于 2013-03-10T10:17:42.063 に答える