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

¿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 型のオブジェクトをパラメータとして受け入れる sort() メソッドを使用します。スーパーT>これは機能的なインターフェイスです。 Java 内の他の多くのメソッドがカスタム方法でオブジェクトを比較するためにこのインターフェイスを使用するため、このインターフェイスは非常に重要です。たとえば、Collections.sort() メソッドや List オブジェクトの sort() メソッド、ストリームでも要素を並べ替えるための 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
) {
}
</string>
  • 最初の引数が 2 番目の引数と等しい場合、ゼロが返されます。たとえば、映画を俳優の数で並べ替えるには、映画 a が映画 b と等しい場合に 0 を返すことができます。
// a  -1
a.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);
</movie>

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

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

movies.sort(comparatorByYear);
</movie></movie>

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

movies.sort(new Comparator<movie>() {
    @Override
    public int compare(Movie o1, Movie o2) {
        return o1.year() - o2.year();
    }
});
</movie>

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

  • 映画を俳優の数で昇順に並べます (俳優の数が少ないものから俳優の数が多いもの):
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
) {
}
</string>

参照メソッドの使用

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

// a  -1
a.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);
</movie>

複数の属性で並べ替える

場合によっては、オブジェクトのリストを複数の属性で並べ替える必要がある場合があります。たとえば、映画をリリース年ごとに昇順に並べ替え、予算ごとに降順に並べ替えたい場合は、次のメソッドを受け取る 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);
</movie></movie>

結論

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

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

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
プラットフォームの独立性は、エンタープライズレベルのJavaアプリケーションにどのように利益をもたらしますか?プラットフォームの独立性は、エンタープライズレベルのJavaアプリケーションにどのように利益をもたらしますか?May 03, 2025 am 12:23 AM

Javaは、プラットフォームの独立性により、エンタープライズレベルのアプリケーションで広く使用されています。 1)プラットフォームの独立性は、Java Virtual Machine(JVM)を介して実装されているため、Javaをサポートする任意のプラットフォームでコードを実行できます。 2)クロスプラットフォームの展開と開発プロセスを簡素化し、柔軟性とスケーラビリティを高めます。 3)ただし、パフォーマンスの違いとサードパーティライブラリの互換性に注意を払い、純粋なJavaコードやクロスプラットフォームテストの使用などのベストプラクティスを採用する必要があります。

プラットフォームの独立性を考慮して、JavaはIoT(Thingのインターネット)デバイスの開発においてどのような役割を果たしますか?プラットフォームの独立性を考慮して、JavaはIoT(Thingのインターネット)デバイスの開発においてどのような役割を果たしますか?May 03, 2025 am 12:22 AM

javaplaysasificanificantduetduetoitsplatformindepence.1)itallowscodetobewrittendunonvariousdevices.2)java'secosystemprovidesutionforiot.3)そのセキュリティフィートルセンハンス系

Javaでプラットフォーム固有の問題に遭遇したシナリオと、どのように解決したかを説明してください。Javaでプラットフォーム固有の問題に遭遇したシナリオと、どのように解決したかを説明してください。May 03, 2025 am 12:21 AM

TheSolution to HandlefilepathsaCrosswindossandlinuxinjavaistousepaths.get()fromthejava.nio.filepackage.1)usesystem.getProperty( "user.dir")およびhearterativepathtoconstructurctthefilepath.2)

開発者にとってJavaのプラットフォーム独立性の利点は何ですか?開発者にとってJavaのプラットフォーム独立性の利点は何ですか?May 03, 2025 am 12:15 AM

java'splatformentepenceissificAntiveSifcuseDeverowsDevelowSowRitecodeOdeonceantoniTONAnyPlatformwsajvm.これは「writeonce、runanywhere」(wora)adportoffers:1)クロスプラットフォームの複雑性、deploymentacrossdiferentososwithusisues; 2)re

さまざまなサーバーで実行する必要があるWebアプリケーションにJavaを使用することの利点は何ですか?さまざまなサーバーで実行する必要があるWebアプリケーションにJavaを使用することの利点は何ですか?May 03, 2025 am 12:13 AM

Javaは、クロスサーバーWebアプリケーションの開発に適しています。 1)Javaの「Write and、Run Averywhere」哲学は、JVMをサポートするあらゆるプラットフォームでコードを実行します。 2)Javaには、開発プロセスを簡素化するために、SpringやHibernateなどのツールを含む豊富なエコシステムがあります。 3)Javaは、パフォーマンスとセキュリティにおいて優れたパフォーマンスを発揮し、効率的なメモリ管理と強力なセキュリティ保証を提供します。

JVMは、Javaの「Write and、Run Anywhere」(Wora)機能にどのように貢献しますか?JVMは、Javaの「Write and、Run Anywhere」(Wora)機能にどのように貢献しますか?May 02, 2025 am 12:25 AM

JVMは、バイトコード解釈、プラットフォームに依存しないAPI、動的クラスの負荷を介してJavaのWORA機能を実装します。 2。標準API抽象オペレーティングシステムの違い。 3.クラスは、実行時に動的にロードされ、一貫性を確保します。

Javaの新しいバージョンは、プラットフォーム固有の問題にどのように対処しますか?Javaの新しいバージョンは、プラットフォーム固有の問題にどのように対処しますか?May 02, 2025 am 12:18 AM

Javaの最新バージョンは、JVMの最適化、標準的なライブラリの改善、サードパーティライブラリサポートを通じて、プラットフォーム固有の問題を効果的に解決します。 1)Java11のZGCなどのJVM最適化により、ガベージコレクションのパフォーマンスが向上します。 2)Java9のモジュールシステムなどの標準的なライブラリの改善は、プラットフォーム関連の問題を削減します。 3)サードパーティライブラリは、OpenCVなどのプラットフォーム最適化バージョンを提供します。

JVMによって実行されたバイトコード検証のプロセスを説明します。JVMによって実行されたバイトコード検証のプロセスを説明します。May 02, 2025 am 12:18 AM

JVMのバイトコード検証プロセスには、4つの重要な手順が含まれます。1)クラスファイル形式が仕様に準拠しているかどうかを確認し、2)バイトコード命令の有効性と正確性を確認し、3)データフロー分析を実行してタイプの安全性を確保し、検証の完全性とパフォーマンスのバランスをとる。これらの手順を通じて、JVMは、安全で正しいバイトコードのみが実行されることを保証し、それによりプログラムの完全性とセキュリティを保護します。

See all articles

ホット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 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

SublimeText3 Mac版

SublimeText3 Mac版

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

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強力な PHP 統合開発環境

SublimeText3 中国語版

SublimeText3 中国語版

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

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。