ホームページ Java &#&チュートリアル Comparator は Java でどのように機能しますか?

Comparator は Java でどのように機能しますか?

Nov 05, 2024 pm 04:52 PM

¿Cómo funciona Comparator en Java?

導入

プロジェクトで作業しているときに、ある種のオブジェクトのコレクションを並べ替える必要が生じることがあります。そのために独自の並べ替えアルゴリズムを実装する必要があると思うかもしれませんが、これは多少不必要ですが、知っておくと損にはなりません。彼らがどのように働くのか。たとえば、整数の配列がある場合、プリミティブの配列を受け入れて昇順に並べ替える Arrays.sort() メソッドを使用できます。これは、結果を配列に代入する必要がないという事実を利用します。このメソッドは元の配列を変更するため、新しい変数。

int[] numbers = {9, 8, 5, 3, 1, 2, 4, 6, 7};
Arrays.sort(numbers);
System.out.println(Arrays.toString(numbers));

// Output
[1, 2, 3, 4, 5, 6, 7, 8, 9]
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

これは、カスタム オブジェクトのコレクション (たとえば、タイプ Movie のレコード) がある場合にも当てはまりますが、Arrays.sort() メソッドを見ると、このタイプのオブジェクトの配列は受け入れられないため、 T 型のオブジェクトと Comparator

コンパレータとは何ですか?

関数インターフェイス Comparator (機能的であるため、ラムダ式として記述できます) は、型 T の 2 つのオブジェクトを比較できるインターフェイスであり、整数、文字列、カスタムの比較に使用されます。オブジェクトなどこのインターフェイスにはいくつかの静的メソッドとデフォルト メソッドがありますが、重要なのは、2 つのオブジェクトを比較するために実装する必要がある Compare() メソッドです。 Compare() は型 T の 2 つのオブジェクトを受け取り、整数を返します。メソッドのシグネチャは次のとおりです:

int compare(T o1, T o2);
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

このメソッドは、o1 が o2 より小さい場合は負の数を返し、それらが等しい場合はゼロを返し、o1 が o2 より大きい場合は正の数を返します。通常はそれぞれ -1、0、または 1 を返します。

あるオブジェクトが別のオブジェクトより小さい、等しい、または大きいとはどういう意味ですか?

オブジェクトの順序はこれに依存するため、compare() メソッドが返す内容を分析してみましょう。メソッドが返す内容の意味は相対的なものであること、つまり昇順または降順の順序を指定する場合に考慮することが重要です。それは状況とそれがどのように実装されるかによって異なります。それぞれの例について、次の レコード を考えてみましょう:

int[] numbers = {9, 8, 5, 3, 1, 2, 4, 6, 7};
Arrays.sort(numbers);
System.out.println(Arrays.toString(numbers));

// Output
[1, 2, 3, 4, 5, 6, 7, 8, 9]
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
  • 最初の引数が 2 番目の引数より小さい場合、負の数が返されます。たとえば、映画をリリース年で並べ替えるには、映画 a が映画 b より小さい場合に -1 を返すことができます。
int compare(T o1, T o2);
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
  • 最初の引数が 2 番目の引数より大きい場合、正の数が返されます。たとえば、映画を予算順に並べ替えるには、映画 a が映画 b よりも大きい場合に 1 を返すことができます。
public record Movie(
        String name,
        List<String> actors,
        int budget,
        int year
) {
}




</p>
<ul>
<li>最初の引数が 2 番目の引数と等しい場合、ゼロが返されます。たとえば、映画を俳優の数で並べ替えるには、映画 a が映画 b と等しい場合に 0 を返すことができます。
</li>
</ul>

<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">// a < b -> -1
a.year() < b.year() -> -1
ログイン後にコピー
ログイン後にコピー

コンパレータの使用

List タイプのオブジェクト内に次のムービーがあるとします。

// a > b -> 1
a.budget() > b.budget() -> 1
ログイン後にコピー
ログイン後にコピー

映画をリリース年ごとに昇順に並べる場合は、Comparator タイプのオブジェクトを作成できます。そして、compare() メソッドをオーバーライドして、このオブジェクトをリストの sort() メソッドに渡します。

// a == b -> 0
a.actors().size() == b.actors().size() -> 0
ログイン後にコピー
ログイン後にコピー

sort() メソッド内の匿名クラスとして実装することもできます。

Movie movie1 = new Movie("The Godfather", Arrays.asList("Marlon Brando", "Al Pacino"), 6000000, 1972);
Movie movie2 = new Movie("The Godfather: Part II", Arrays.asList("Al Pacino", "Robert De Niro"), 13000000, 1974);
Movie movie3 = new Movie("The Shawshank Redemption", Arrays.asList("Tim Robbins", "Morgan Freeman"), 25000000, 1994);
Movie movie4 = new Movie("The Dark Knight", Arrays.asList("Christian Bale", "Heath Ledger"), 185000000, 2008);

List<Movie> movies = Arrays.asList(movie1, movie2, movie3, movie4);
ログイン後にコピー
ログイン後にコピー

より簡潔には、sort() メソッドでラムダ式を直接使用します。

Comparator<Movie> comparatorByYear = new Comparator<Movie>() {
    @Override
    public int compare(Movie o1, Movie o2) {
        return o1.year() - o2.year();
    }
};

movies.sort(comparatorByYear);
ログイン後にコピー
ログイン後にコピー

これらの実装はいずれも、リリース年の昇順でリストを並べ替えます。降順で並べ替える場合は、ラムダ式の引数の順序を変更するか、減算に負符号を追加します。

movies.sort(new Comparator<Movie>() {
    @Override
    public int compare(Movie o1, Movie o2) {
        return o1.year() - o2.year();
    }
});
ログイン後にコピー

カスタム オブジェクトのリストを並べ替える方法の他の例は次のとおりです。

  • 映画を俳優の数で昇順に並べます (俳優の数が少ないものから俳優の数が多いもの):
movies.sort((p1, p2) -> p1.year() - p2.year());
ログイン後にコピー
  • 映画を予算の降順に並べ替えます (最高予算から最低予算):
movies.sort((p1, p2) -> p2.year() - p1.year());
// o
movies.sort((p1, p2) -> - (p1.year() - p2.year()));
ログイン後にコピー
  • 映画を名前で昇順に並べ替えます:
movies.sort((p1, p2) -> p1.actors().size() - p2.actors().size());
ログイン後にコピー

他の例としては、整数のリストを降順に並べ替える必要がある場合があります。

movies.sort((p1, p2) -> p2.budget() - p1.budget());
// o 
movies.sort((p1, p2) -> - (p1.budget() - p2.budget()));
ログイン後にコピー

これを行うには、要素を降順に並べるコンパレータを返す静的メソッド Comparator.reverseOrder() と、要素を昇順に並べる Comparator.naturalOrder() を使用することもできます。

int[] numbers = {9, 8, 5, 3, 1, 2, 4, 6, 7};
Arrays.sort(numbers);
System.out.println(Arrays.toString(numbers));

// Output
[1, 2, 3, 4, 5, 6, 7, 8, 9]
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

Integer.compare() を使用する

Java 内には、この種の比較を効率的な方法で実行できるメソッドがすでにあります。たとえば、2 つの整数を比較し、最初の引数が 2 番目の引数であるゼロより小さい場合に負の数を返す Integer.compare() などです。 if が等しい場合は、最初の引数が 2 番目の引数より大きい場合は正の数になります。このメソッドがどのように動作するかを分析すると、これが上で説明したものと似ており、Comparator インターフェイスの Compare() メソッドが必要とするものを正確に返すことがわかります。 Integer.compare() の実装は次のとおりです:

int compare(T o1, T o2);
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

映画を公開年ごとに昇順に並べ替えたい場合は、Integer.compare():
を使用できます。

public record Movie(
        String name,
        List<String> actors,
        int budget,
        int year
) {
}
ログイン後にコピー

参照メソッドの使用

参照メソッドを使用して、以前とは異なる比較を実行することができます。たとえば、整数のリストを昇順で並べ替えることができます。

// a < b -> -1
a.year() < b.year() -> -1
ログイン後にコピー

Integer は、compareTo() メソッドを持つ唯一のクラスではありません。たとえば、String には、2 つの文字列を辞書順に比較する CompareTo() メソッドがあるため、文字列のリストを並べ替えたり、CharSequence を使用したりすることもできます。 Compare() メソッド (技術的には一連の文字を表します)。

// a > b -> 1
a.budget() > b.budget() -> 1
ログイン後にコピー
ログイン後にコピー

映画の例に戻ります。映画を公開年ごとに昇順に並べ替える場合は、comparingInt() メソッドを参照メソッドとして使用できます。

// a == b -> 0
a.actors().size() == b.actors().size() -> 0
ログイン後にコピー
ログイン後にコピー

または、文字列型属性 (この場合は映画の名前) に従って比較するには:

Movie movie1 = new Movie("The Godfather", Arrays.asList("Marlon Brando", "Al Pacino"), 6000000, 1972);
Movie movie2 = new Movie("The Godfather: Part II", Arrays.asList("Al Pacino", "Robert De Niro"), 13000000, 1974);
Movie movie3 = new Movie("The Shawshank Redemption", Arrays.asList("Tim Robbins", "Morgan Freeman"), 25000000, 1994);
Movie movie4 = new Movie("The Dark Knight", Arrays.asList("Christian Bale", "Heath Ledger"), 185000000, 2008);

List<Movie> movies = Arrays.asList(movie1, movie2, movie3, movie4);
ログイン後にコピー
ログイン後にコピー

複数の属性で並べ替える

場合によっては、オブジェクトのリストを複数の属性で並べ替える必要がある場合があります。たとえば、映画をリリース年ごとに昇順に並べ替え、予算ごとに降順に並べ替えたい場合は、次のメソッドを受け取る thenComparing() メソッドを使用できます。コンパレーターであり、複数の属性による順序付けを担当します。たとえば、公開年が同じ 2 つの映画 a と b がある場合、予算順に並べられます。

Comparator<Movie> comparatorByYear = new Comparator<Movie>() {
    @Override
    public int compare(Movie o1, Movie o2) {
        return o1.year() - o2.year();
    }
};

movies.sort(comparatorByYear);
ログイン後にコピー
ログイン後にコピー

結論

コンパレータは、パーソナライズされた方法でオブジェクトを比較できるため、Java で多くの場面で役に立ちます。それだけでなく、多くの Java コレクション メソッドでも使用でき、並べ替えるための複数のコンパレータを使用することもできます。さまざまな方法で。いずれの場合でも、IDE 内の Comparator ドキュメントまたは公式 Java ドキュメントを参照して、使用できるメソッドとその実装方法を確認できます。

以上がComparator は Java でどのように機能しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

会社のセキュリティソフトウェアはアプリケーションの実行に失敗していますか?それをトラブルシューティングと解決する方法は? 会社のセキュリティソフトウェアはアプリケーションの実行に失敗していますか?それをトラブルシューティングと解決する方法は? Apr 19, 2025 pm 04:51 PM

一部のアプリケーションが適切に機能しないようにする会社のセキュリティソフトウェアのトラブルシューティングとソリューション。多くの企業は、内部ネットワークセキュリティを確保するためにセキュリティソフトウェアを展開します。 ...

名前を数値に変換してソートを実装し、グループの一貫性を維持するにはどうすればよいですか? 名前を数値に変換してソートを実装し、グループの一貫性を維持するにはどうすればよいですか? Apr 19, 2025 pm 11:30 PM

多くのアプリケーションシナリオでソートを実装するために名前を数値に変換するソリューションでは、ユーザーはグループ、特に1つでソートする必要がある場合があります...

MapsTructを使用したシステムドッキングのフィールドマッピングの問題を簡素化する方法は? MapsTructを使用したシステムドッキングのフィールドマッピングの問題を簡素化する方法は? Apr 19, 2025 pm 06:21 PM

システムドッキングでのフィールドマッピング処理は、システムドッキングを実行する際に難しい問題に遭遇することがよくあります。システムのインターフェイスフィールドを効果的にマッピングする方法A ...

エンティティクラス変数名をエレガントに取得して、データベースクエリ条件を構築する方法は? エンティティクラス変数名をエレガントに取得して、データベースクエリ条件を構築する方法は? Apr 19, 2025 pm 11:42 PM

データベース操作にMyBatis-Plusまたはその他のORMフレームワークを使用する場合、エンティティクラスの属性名に基づいてクエリ条件を構築する必要があることがよくあります。あなたが毎回手動で...

Intellijのアイデアは、ログを出力せずにSpring Bootプロジェクトのポート番号をどのように識別しますか? Intellijのアイデアは、ログを出力せずにSpring Bootプロジェクトのポート番号をどのように識別しますか? Apr 19, 2025 pm 11:45 PM

intellijideaultimatiateバージョンを使用してスプリングを開始します...

Javaオブジェクトを配列に安全に変換する方法は? Javaオブジェクトを配列に安全に変換する方法は? Apr 19, 2025 pm 11:33 PM

Javaオブジェクトと配列の変換:リスクの詳細な議論と鋳造タイプ変換の正しい方法多くのJava初心者は、オブジェクトのアレイへの変換に遭遇します...

eコマースプラットフォームSKUおよびSPUデータベースデザイン:ユーザー定義の属性と原因のない製品の両方を考慮する方法は? eコマースプラットフォームSKUおよびSPUデータベースデザイン:ユーザー定義の属性と原因のない製品の両方を考慮する方法は? Apr 19, 2025 pm 11:27 PM

eコマースプラットフォーム上のSKUおよびSPUテーブルの設計の詳細な説明この記事では、eコマースプラットフォームでのSKUとSPUのデータベース設計の問題、特にユーザー定義の販売を扱う方法について説明します。

データベースクエリにTKMYBATISを使用するときに、エンティティクラスの変数名の構築クエリ条件をエレガントに取得する方法は? データベースクエリにTKMYBATISを使用するときに、エンティティクラスの変数名の構築クエリ条件をエレガントに取得する方法は? Apr 19, 2025 pm 09:51 PM

データベースクエリにTKMYBATISを使用する場合、クエリ条件を構築するためにエンティティクラスの変数名を優雅に取得する方法は一般的な問題です。この記事はピン留めします...

See all articles