1. 程式人生 > >Java中常用的比較器Comparable與Comparator

Java中常用的比較器Comparable與Comparator

在公司實習了一段時間發現自己有些基礎知識理解的不是很清楚,今天把比較器的部分簡單總結一下!

有不對的歡迎指正!

需要為多個物件排序時必須設定規定的排序規則,排序規則可以通過比較器進行設定。Java提供兩種比較常用的比較器:Comparable和Comparator.

Comparable介面

它是一個要進行多個物件比較預設實現的一個介面,定義如下:
public interface Comparable<T>{
    public int compareTo(T obj);
}

如果想要實現物件屬性的排序功能,就要實現Comparable介面,並且複寫compareTo(T obj)方法,此方法的返回值是一個int型別的資料,有三種情況:
-相等, 0;


-小於, -1;
-大於, 1。
例子如下

class Person implements Comparable<Person>{
    private String name;
    private double height;
    public Person(String name, double height){
        this.name = name;
        this.height = height;
    } 
    @Override
    public String toString(){
        return
"姓名:"+this.name+",身高:"+this.height+"\n"; } @Override public int compareTo(Person per){ if(this.height > per.height){ return 1; }else if(this.height < per.height){ return -1; }else{ return 0; } } } public class
TestDemo{ public static void main(String[] args){ List<Person> perList = new ArrayList<Person>(); perList.add(new Person("張三"174.8)); perList.add(new Person("李四"175.7)); Object[] obj[] = perList.toArrays(); Arrays.sort(obj); System.out.println(Arrays.toString(obj)); } }

Comparator—挽救的比較器介面

大家都知道Comparable介面是一個類在定義時就已經預設實現好的功能了。

假如一個類已經開發完成,在此類使用很久之後,你又想實現這個類物件的陣列排序,但是此類沒有實現Comparable介面,所以一定不能用Arrays類的sort()方法實現排序,並且這個類由於某種原因不能修改。這種情況下如果還想實現排序,就必須進行另一種比較規則的設定,即:挽救比較規則,Comparator介面定義如下:

public interface Comparator<T>{
    public int compare(T obj1, T obj2);
    public boolean equals(Object obj);
}

舉例說明:

class Book{
    private String name;
    private double price;
    public Book(String name, double price){
        this.name = name;
        this.price = price;
    }
    public void setPrice(double price){
        this.price = price;
    }
    public void setName(String name){
        this.name = name;
    }
    public String getName(){
        retrun name;
    }
    public double getPrice(){
        return price;
    }
    @Override
    public String toString(){
        return "書名:"+this.name+",價格:"+this.price;
    }
}

假如上面的類就是定義的完整的類,並且沒有實現Comparable介面,現在就需要單獨定一個類,實現Comparator介面,專門為Book類物件提供比較規則,第一如下:

class BookComparatoe implements Comparator<Book>{
    @Override
    public int compare(Book o1, Book o2){
         if(o1.getPrice() > o2.getPrice()){
              return 1;
         }else if(o1.getPrice() < o2.getPrice()){
              return -1;
         }
         return 0;
    }
}

如果想要使用以上規則必須使用Arrays 的另外一個物件比較的排序方法。

public static <T> void sort(T[] a, Comparator<? super T> c);

實現如下:

public class TestDemo{
    public static void main(String[] args){
        Book book[] = new Book[]{
            new Book("三國演義", 23);
            new Book("紅樓夢"12);
            new book("水滸傳"8);};
        Arrays.sort(book, new BookComparator());
        System.out.println(Arrays.toString(book));
    }
}

通過以上總結我們能清楚地瞭解了Comparable和Comparator的區別和用法。

本文主要參考:魔樂科技的Java基礎一書。