web-dev-qa-db-ja.com

1つのクラスだけで2つの同等のメソッドを作成するにはどうすればよいですか?

クラスが1つあり、すでに1つの属性で並べ替えています。次に、データを並べ替える別の方法を作成する必要があるという、別のことを行う必要があります。どうすれば作成できるので、2つの方法から選択できます。私が知っている唯一のコマンドは、データを比較するクラスからcompareToメソッドを取得するCollections.sortです。

それも可能ですか?

25
pringlesinn

あなたがする必要があるのはカスタムを実装することです Comparator 。そして、使用します:

Collections.sort(yourList, new CustomComparator<YourClass>());

具体的には、次のように記述できます(これにより、Comparatorを実装するAnonymousクラスが作成されます)。

Collections.sort(yourList, new Comparator<YourClass>(){
    public int compare(YourClass one, YourClass two) {
        // compare using whichever properties of ListType you need
    }
});

必要に応じて、これらをクラスに組み込むことができます。

class YourClass {

    static Comparator<YourClass> getAttribute1Comparator() {
        return new Comparator<YourClass>() {
            // compare using attribute 1
        };
    }

    static Comparator<YourClass> getAttribute2Comparator() {
        return new Comparator<YourClass>() {
            // compare using attribute 2
        };
    }
}

それは次のように使用できます:

Collections.sort(yourList, YourClass.getAttribute2Comparator());
62
jjnguy

クラスに含めることができるcompareTo()メソッドは1つだけです。

同じクラスを複数の方法でソートする場合は、Comparator実装を作成します。

3
jzd

2つのメソッドがまったく同じフットプリントを必要とする場合、複数の用途で単一のクラスを不適切にオーバーロードしている可能性があります。これは、クラス階層を修正することで解決されます。たとえば、「shape」を使用する代わりに、「oval」、「rectangle」でサブクラス化します。 、など。

サブクラス化が意味をなさない場合は、異なる比較クラスを作成する必要があります。 Javaでは、比較にコンパレータを使用することがよくあります。 IsbnComparator、AuthorComparatorなどのいくつかを作成します(または構成可能なコンパレータを作成します)。

ああ、設定可能なオプションは次のようになります。

 BookComparatorはCompartor {
 enum FIELD {AUTHOR、ISBN、...}; 
 setSortOrder(intrank、FIELD field){...} 
}を実装します。 
3
atk