1. 程式人生 > 其它 >java中Comparable和Comparator

java中Comparable和Comparator

目錄

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

使用步驟

  1. 首先創意一個類實現Comparatro介面。note:這個類為你要比較的類的比較類。eg:如果你要想要比較Person物件,那麼不要讓Person實現這個介面,而是建立一個新的類叫做:PersonComparator,使用這個類實現Comparator。
  2. 比較時,傳遞比較器即可。

例項:

要比較的類

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的小白,如果文章有任何錯誤的地方,望各位程式設計大佬進行指正,謝謝。