Java で Comparable と Comparator を使用する方法
Comparable と Comparator
Comparable と Comparator は、2 つの Java ソート関連インターフェイスであり、自然ソートおよびカスタマイズされたソートとも呼ばれます。最近関連コンテンツを読んだので、以下に私自身の学習状況を記録します。
Comparable と Comparator は並べ替えに関する 2 つのインターフェイスであり、Java コレクションに並べ替え機能を実装するために使用されます。特定の機能はAPIから取得できます。
Comparable
これは API ドキュメントからの簡単な紹介です:
#このインターフェイスは、各クラスのオブジェクトに全体的な順序を課します。これを実装します。この順序付けはクラスの自然な順序付けと呼ばれ、クラスの CompareTo メソッドはその自然な比較メソッドと呼ばれます。このオブジェクトと指定されたオブジェクトを比較して順序を決定します。負の整数、ゼロ、または正の整数を次のように返します。このオブジェクトは、指定されたオブジェクトより小さい、等しい、または大きいです。
使用法:
エンティティ クラス インターフェイスを並べ替えるための Comparable の実装が必要です。並べ替え機能を持たせるには、compareTo() メソッドをオーバーライドします。要素を自動的に並べ替える一部のコレクション (TreeSet など) は、要素がコレクションに追加されるときに、並べ替えのために CompareTo() メソッドを自動的に呼び出します (要素がこのインターフェイスを実装している必要がある場合)。ただし、TreeSet に限らず他の場所でも使用でき、広く使用されています。
Comparator
これは API ドキュメントからの簡単な紹介です。
##あるコレクションに全体的な順序を課す比較関数。オブジェクト。コンパレータを並べ替えメソッド (Collections.sort や Arrays.sort など) に渡して、並べ替え順序を正確に制御できるようにします。また、コンパレータを使用して、特定のデータ構造 (並べ替えられたセットや並べ替えられたセットなど) の順序を制御することもできます。マップ))、または自然な順序を持たないオブジェクトのコレクションに順序を提供します。
使用法:
Comparator はサードパーティです。インターフェイス 、具体的な使用法は次のとおりです。コンパレータを設計し、クラスを作成し、このインターフェイスを実装し、compare() メソッドをオーバーライドします。また、Comparator は関数型インターフェイスであるため、Comparator オブジェクトの代わりにラムダ式を使用でき、コードがより簡潔かつ明確になります。 トークは安いので、コードを見せてください。注: ブログの内容はあまり詳しくない可能性があるため、具体的な詳細を確認したい場合は、こちらを参照してください。書籍や公式ドキュメントへ ここでは主に、基本的な使い方を簡単に紹介する内容になります。
テスト エンティティ クラス: Dog
public class Dog implements Comparable<Dog>{ private String name; private int age; public Dog(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Dog [name=" + name + ", age=" + age + "]"; } @Override public int compareTo(Dog dog) { return this.age > dog.age ? 1 : this.age < dog.age ? -1 : 0; } }
テスト エンティティ クラス: Cat
public class Cat implements Comparable<Cat>{ private String name; private Integer age; public Cat(String name, Integer age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } @Override public String toString() { return "Cat [name=" + name + ", age=" + age + "]"; } @Override public int compareTo(Cat o) { //可以直接调用,这样更简单 //调换 o.age 和 this.age 就是相反的顺序 return o.age.compareTo(this.age); } }
テスト クラス:Test
public class Test { public static void main(String[] args) { List<Dog> dogs = new LinkedList<>(); List<Cat> cats = new LinkedList<>(); dogs.add(new Dog("大黄",6)); dogs.add(new Dog("大白",1)); dogs.add(new Dog("小黑",5)); dogs.add(new Dog("旺财",3)); dogs.add(new Dog("二哈",2)); cats.add(new Cat("牛牛",3)); cats.add(new Cat("花咪",4)); cats.add(new Cat("咪咪",10)); cats.add(new Cat("小黄",2)); cats.add(new Cat("大橘",6)); //参数为 null 使用 自然排序,否则使用 定制排序 //也可以看出来 定制排序 优先级高于 自然排序 System.out.println("---------自然排序 升序--------"); dogs.sort(null); dogs.forEach(System.out::println); System.out.println("---------自然排序 降序--------"); cats.sort(null); cats.forEach(System.out::println); //定制排序 //Comparator<Dog> c = (e1,e2)->e2.getAge() - e1.getAge(); //dogs.sort(c) 这个就是下面这个的具体形式, //可以看出来参数是一个 Comparator 对象 System.out.println("---------定制排序 降序--------"); dogs.sort((e1,e2)->e2.getAge() - e1.getAge()); //流式API的简单的应用,效果和上面的类似,或者直接使用 forEacn 循环遍历 dogs.stream().forEach(System.out::println); System.out.println("---------定制排序 升序--------"); // 另一种遍历方式,可以看出来函数式编程非常灵活,我也是初学,觉得很神奇。 cats.stream() .sorted((e1,e2)->e1.getAge()-e2.getAge()) .forEach(System.out::println); } }
実行中のスクリーンショット:
補足説明:list.sort() メソッド
APIドキュメントの説明:
指定されたコンパレータによって引き起こされる順序に従ってこのリストを並べ替えます。ご覧のとおり、このメソッドは、受信パラメータが null の場合に Comparator オブジェクトをソートします。 、自然な並べ替えが実行されますが、注意: 自然な並べ替えの前提は、対応するエンティティ クラスが Comparable インターフェイスを実装し、compareTo() メソッドをオーバーライドすることです。このリスト内のすべての要素は、以下を使用して相互に比較できる必要があります。指定されたコンパレータ (つまり、 c.compare(e1, e2) は、リスト内の要素 e1 および e2 に対して ClassCastException をスローしてはなりません)。指定されたコンパレータが null の場合、このリスト内のすべての要素は Comparable インターフェイスを実装する必要があり、要素の自然な順序を使用する必要があります。このリストは変更可能である必要がありますが、サイズ変更可能である必要はありません。
以上がJava で Comparable と Comparator を使用する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック









Java の乱数ジェネレーターのガイド。ここでは、Java の関数について例を挙げて説明し、2 つの異なるジェネレーターについて例を挙げて説明します。

Java の Weka へのガイド。ここでは、weka java の概要、使い方、プラットフォームの種類、利点について例を交えて説明します。

この記事では、Java Spring の面接で最もよく聞かれる質問とその詳細な回答をまとめました。面接を突破できるように。

Java 8は、Stream APIを導入し、データ収集を処理する強力で表現力のある方法を提供します。ただし、ストリームを使用する際の一般的な質問は次のとおりです。 従来のループにより、早期の中断やリターンが可能になりますが、StreamのForeachメソッドはこの方法を直接サポートしていません。この記事では、理由を説明し、ストリーム処理システムに早期終了を実装するための代替方法を調査します。 さらに読み取り:JavaストリームAPIの改善 ストリームを理解してください Foreachメソッドは、ストリーム内の各要素で1つの操作を実行する端末操作です。その設計意図はです

Java での日付までのタイムスタンプに関するガイド。ここでは、Java でタイムスタンプを日付に変換する方法とその概要について、例とともに説明します。

カプセルは3次元の幾何学的図形で、両端にシリンダーと半球で構成されています。カプセルの体積は、シリンダーの体積と両端に半球の体積を追加することで計算できます。このチュートリアルでは、さまざまな方法を使用して、Javaの特定のカプセルの体積を計算する方法について説明します。 カプセルボリュームフォーミュラ カプセルボリュームの式は次のとおりです。 カプセル体積=円筒形の体積2つの半球体積 で、 R:半球の半径。 H:シリンダーの高さ(半球を除く)。 例1 入力 RADIUS = 5ユニット 高さ= 10単位 出力 ボリューム= 1570.8立方ユニット 説明する 式を使用してボリュームを計算します。 ボリューム=π×R2×H(4
