ホームページ >Java >&#&チュートリアル >複数のフィールドに基づいて Java オブジェクトを比較するにはどうすればよいですか?

複数のフィールドに基づいて Java オブジェクトを比較するにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-21 03:26:10494ブラウズ

How Can I Compare Java Objects Based on Multiple Fields?

複数のフィールドによるオブジェクトの比較

オブジェクト指向プログラミングでは、さまざまなフィールドに基づいてオブジェクトを比較することが望ましいことがよくあります。ただし、Comparable インターフェイスでは、単一のフィールドによる比較のみが可能です。

問題

フィールド firstName、lastName、および age を持つ Person クラスについて考えてみましょう。過剰なメソッドやオーバーヘッドを追加することなく、複数のフィールドでこれらのオブジェクトを比較する方法が必要です。

Java 8 ソリューション

Java 8 では、ラムダ式とメソッド参照が導入されました。カスタム コンパレータを簡単に作成できます:

Comparator<Person> comparator = Comparator.comparing((Person p) -> p.firstName)
    .thenComparing(p -> p.lastName)
    .thenComparingInt(p -> p.age);

このコンパレータは、まず firstName を比較し、次に lastName を比較します。

代替構文

Person クラスにフィールドのアクセサ メソッドがある場合、メソッド参照を使用してコンパレータを簡素化できます。

Comparator<Person> comparator = Comparator.comparing(Person::getFirstName)
    .thenComparing(Person::getLastName)
    .thenComparingInt(Person::getAge);

の使用コンパレータ

コンパレータを作成したら、次のように使用できます:

  • 人物オブジェクトのコレクションを並べ替えるには:

    List<Person> persons = ...;
    Collections.sort(persons, comparator);
  • 2 人の人物を比較するにはオブジェクト:

    Person p1 = ...;
    Person p2 = ...;
    int result = comparator.compare(p1, p2);

Comparable の実装

クラスを直接比較する必要がある場合 (ソートされたデータ構造で使用する場合など)、次のメソッドを使用して Comparable インターフェイスを実装できます:

@Override
public int compareTo(Person o) {
    int result = Comparator.comparing(Person::getFirstName)
        .thenComparing(Person::getLastName)
        .thenComparingInt(Person::getAge)
        .compare(this, o);
    return result;
}

Thisこのアプローチにより、オブジェクトの比較が簡素化され、複数の専用の比較メソッドの必要性が減ります。

以上が複数のフィールドに基づいて Java オブジェクトを比較するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。