java中Comparable和Comparator
阿新 • • 發佈:2022-05-05
目錄
1.Comparable
2.Comparator
3.Comparable和Comparator的區別
Comparable
1. Comparable是java.lang包中的一個排序介面。
2. 只要一個類實現了這個介面就可以意味著這個類支援排序。
3.實現了這個類的介面的列表或者陣列可以可以使用Collections.sort或Arrays.sort進行排序。
4.該介面的定義:
1 public interface Comparable<T>
2 {
3 public int compareTo(T o);
4 }
T表示可以與這個物件進行比較的那些物件的型別。
這個方法只有一個coompareTo介面。實現這個介面的類必須要重寫這個方法。
比較的規則:
- 如果該物件和指定比較的物件相等,那麼返回0。
- 如果該物件比指定比較的物件大,那麼返回正數。
- 如果該物件比指定比較的物件小,返回負數。
例項:
實現Comparable的類:
class Person implements Comparable<Person>{
String name;
int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
/**
* 重新的compareTo方法。
* @param person 用於指定的比較的物件。
* @returns 如果當前物件的年齡和指定物件的年齡相等則返回0,如果當前物件的年齡大於指定物件
* 的年齡則返回正數。如果當前物件的年齡比指定物件的年齡小,則返回負數。
*/
@Override
public int compareTo(Person person) {
return this.age - person.age;
}
}
note:這裡為了演示,沒有進行封裝。
進行比較演示:
import java.util.Arrays;
public class Test {
public static void main(String[] args) {
// 建立一個Person陣列。
Person[] persons = new Person[]{new Person("tom", 20), new Person("jack", 12)};
// 排序之前
System.out.print("排序之前:");
for (Person p : persons) {
System.out.print("name:" + p.name + ", age:" + p.age + " ");
}
// 排序之後
Arrays.sort(persons);
System.out.println("排序之後:");
for (Person p : persons) {
System.out.print("name:" + p.name + ", age:" + p.age + " ");
}
}
}
結果:
Comparator
1.Comparator是java.util中的一個比較的介面。
2. 如果我們想要控制某個類的次序,而這個類並沒有繼承Comparable介面,那麼我們就可以使用Comparator介面。
3. 比較的規則:大致和上面的規則相同,不過也有不同的地方,詳情請看下面的程式碼。
4.原始碼:
package java.util;
public interface Comparator<T>
{
int compare(T o1, T o2);
boolean equals(Object obj);
}
使用步驟
- 首先創意一個類實現Comparatro介面。note:這個類為你要比較的類的比較類。eg:如果你要想要比較Person物件,那麼不要讓Person實現這個介面,而是建立一個新的類叫做:PersonComparator,使用這個類實現Comparator。
- 比較時,傳遞比較器即可。
例項:
要比較的類
class Person {
String name;
int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
該類的比較類
class PersonComparator implements Comparator<Person> {
/**
* 用來比較兩個物件的年齡。
* @param p1 用來比較的第一個物件。
* @param p2 用力比較的第二個物件。
* @return 如果兩個物件相等,則返回零。如果第一個物件大於第二個物件,則返回正數。如果第二個物件大於第一個物件,則返回負數。
*/
@Override
public int compare(Person p1, Person p2) {
return p1.age - p2.age;
}
}
比較演示:
import java.util.Comparator;
import java.util.Arrays;
public class Test {
public static void main(String[] args) {
// 建立一個Person陣列。
Person[] persons = new Person[]{new Person("tom", 20), new Person("jack", 12)};
// 排序之前
System.out.print("排序之前:");
for (Person p : persons) {
System.out.print("name:" + p.name + ", age:" + p.age + " ");
}
// 排序之後
// 將比較器作為引數傳入。
Arrays.sort(persons, new PersonComparator());
System.out.println("排序之後:");
for (Person p : persons) {
System.out.print("name:" + p.name + ", age:" + p.age + " ");
}
}
}
也可以使用匿名陣列:
import java.util.Comparator;
import java.util.Arrays;
public class Test {
public static void main(String[] args) {
// 建立一個Person陣列。
Person[] persons = new Person[]{new Person("tom", 20), new Person("jack", 12)};
// 排序之前
System.out.print("排序之前:");
for (Person p : persons) {
System.out.print("name:" + p.name + ", age:" + p.age + " ");
}
// 排序之後
// 將比較器作為引數傳入。
Arrays.sort(persons, new Comparator<Person>() {
@Override
public int compare(Person p1, Person p2) {
return p1.age - p2.age;
}
});
System.out.println("排序之後:");
for (Person p : persons) {
System.out.print("name:" + p.name + ", age:" + p.age + " ");
}
}
}
效果:
Comparable和Comparator的區別:
1.兩者不在一個包。Comparable在java.lang中,而Comparator在java.util包中。
2.實現Comparable的類通常是一個我們要經常使用的類。比如:java中的String類等等。需要修改原始碼。而Comparator可以在不同修改原始碼的情況下,來完成比較。從了保護了程式碼。
兩個方法各有優劣。如果你的類需要經常使用比較的操作,那麼可以考慮讓這個了實現Comparable介面。如果你偶爾使用比較的操作,那麼可以考慮使用Comparator。
注意:作者只是一個自學java的小白,如果文章有任何錯誤的地方,望各位程式設計大佬進行指正,謝謝。