7

PersonクラスとEmployeeクラスの2つのオブジェクトがあります。どちらのクラスにも共通の属性ageがあります。そして、これらのクラスの両方のオブジェクトをArraylistにいくつか追加しました。次に、2つで1つのComparatorを作成し、それをCollectionsクラスのsortメソッドに渡します。そして、リストを年齢に基づいてソートする必要があります。JavaでのComparableとComparatorの使用をより明確にするために、これを試しています。

編集:私がこの質問をした理由は、私がコンパレーターと比較可能性について明確ではなかったということでした。クラスがComparableを実装している場合、他のクラスのオブジェクトと比較できないことをどこかで読みました(クラスキャスト例外のため)。

ここで、EmployeeとPersonでリレーションシップを作成する場合、Comparatorを実装する必要はありません(これらのクラスの名前またはその他の共通属性に基づいて並べ替えを実行する場合を除く)。

繰り返しになりますが、ComparatorとComparableをより明確にするために、この質問をしました。

これまで私が理解できたのは、複数のパラメーターでソートを実行したい場合は、Comparatorを実装してCollections.srot()に渡す必要があるということです。

または、並べ替えるオブジェクトのクラスを制御できない場合は、カスタム並べ替えでComparatorを実装する必要があります。(私が間違っているか、何かが足りない場合は、私を訂正してください)

編集

これで、ComparableとComparatorの使用法を理解できたと思います。正しい概念を確実に理解するために、私が理解していることは次のとおりです。異なるクラスの2つのオブジェクトを比較する(そして関係がない)場合は、生のコンパレータを使用して、compareメソッドをオーバーライドする必要があります。誰かがComparableではなくComparatorを実装するもう一つの理由は、ソートに柔軟性を持たせるためです。そして、自然ソートから私が理解しているのは、CompareToメソッドのClassによって実装されたロジックです。

私がこれらすべての点で正しいことを願っています。

4

3 に答える 3

6

Ageable と呼ばれるインターフェイスを定義でき、Employee と Person はこのインターフェイスを実装できます。また、同じ効果を持つ抽象クラスを定義することもできます (そして、Employee と Person は抽象クラスから継承されます)。このため、通常のクラスも使用できることに注意してください。必要なことは何でもできます。

また、Employee が Person でないと言う理由がない場合 (たとえば、ロボットがオフィスで働いている場合)、Employee は Person から継承できます。

于 2012-09-13T20:35:10.657 に答える
4

EmployeeをPersonのサブクラスにします。(すべての従業員が人であると仮定します)次に、Comparator<Person>

于 2012-09-13T20:34:59.647 に答える
3

インターフェイスを作成する必要がありますAgeProvider

public interface AgeProvider {
    int getAge();
}

との両方PersonEmployee実装する必要がありますAgeProvider。これで、2を比較するコンパレータを実装できますAgeProvider

于 2012-09-13T20:34:13.320 に答える