ホームページ  >  記事  >  Java  >  Java で Comparable と Comparator を使用する方法

Java で Comparable と Comparator を使用する方法

WBOY
WBOY転載
2023-05-03 10:07:061297ブラウズ

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);
	}
}

実行中のスクリーンショット:

Java で Comparable と Comparator を使用する方法

補足説明:list.sort() メソッドAPIドキュメントの説明:

指定されたコンパレータによって引き起こされる順序に従ってこのリストを並べ替えます。

このリスト内のすべての要素は、以下を使用して相互に比較できる必要があります。指定されたコンパレータ (つまり、 c.compare(e1, e2) は、リスト内の要素 e1 および e2 に対して ClassCastException をスローしてはなりません)。指定されたコンパレータが null の場合、このリスト内のすべての要素は Comparable インターフェイスを実装する必要があり、要素の自然な順序を使用する必要があります。このリストは変更可能である必要がありますが、サイズ変更可能である必要はありません。

ご覧のとおり、このメソッドは、受信パラメータが null の場合に Comparator オブジェクトをソートします。 、自然な並べ替えが実行されますが、注意: 自然な並べ替えの前提は、対応するエンティティ クラスが Comparable インターフェイスを実装し、compareTo() メソッドをオーバーライドすることです。

以上がJava で Comparable と Comparator を使用する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。