1. 程式人生 > >Java Comparable和Comparator

Java Comparable和Comparator

排序 hide fun app private args tostring div oid

Java中在進行數據排序時,Comparable和Comparator不可缺少會遇得到。普通的String、Integer等類型,已經實現了Comparable接口,而有些時候,我們須要對一些其它不存在內在排序關系的類進行排序,那麽就須要實現以上兩個接口,可是會有所不同。

之前搜索兩者的關系。看到這樣一篇文章。Comparable與Comparator的差別,裏面有些說法有點太深奧,只是我來總結的話。兩者最大的差別就在於假設實現Comparable,就意味著類的排序規則固定了,而假設實現Comparator,類本身是沒有排序規則的,僅僅是通過制定外部規則使其進行排序,排序規則你能夠指定非常多類型

那麽就且來看看我做的一個樣例,我們新建一個美女類(BeautyGirl)。使其具有年齡(age)、身高(height)屬性,姑且依照年齡優先於身高的原則來進行排序,那麽實現方式就有以下的方式。

Comparable

package com.mwq.comparable;

public class BeautyGirl implements Comparable<BeautyGirl> {
    private int age;
    private Double height;

    public int getAge() {
        return age;
    }

    public
void setAge(int age) { this.age = age; } public Double getHeight() { return height; } public void setHeight(Double height) { this.height = height; } @Override public int compareTo(BeautyGirl girl) { if (this.getAge() == girl.getAge()) { return
compareHeight(girl); } else { return this.getAge() - girl.getAge(); } } private int compareHeight(BeautyGirl girl) { return girl.getHeight().compareTo(this.getHeight()); } @Override public String toString() { return "美女{年齡:" + this.getAge() + "身高:" + this.getHeight() + "}"; } }

實現comparable接口,就意味著須要在美女類中實現compareTo方法,也就是說,該類在排序的時候必須是年齡優先於身高。

來看看測試類

package com.mwq.comparable;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Test {

    public static void main(String[] args) {
        List<BeautyGirl> girls = new ArrayList<BeautyGirl>();

        BeautyGirl girl = new BeautyGirl();
        girl.setAge(28);
        girl.setHeight(170.00);
        girls.add(girl);

        girl = new BeautyGirl();
        girl.setAge(25);
        girl.setHeight(183.00);
        girls.add(girl);

        girl = new BeautyGirl();
        girl.setAge(28);
        girl.setHeight(180.30);
        girls.add(girl);

        girl = new BeautyGirl();
        girl.setAge(32);
        girl.setHeight(170.00);
        girls.add(girl);

        girl = new BeautyGirl();
        girl.setAge(21);
        girl.setHeight(170.00);
        girls.add(girl);

        for (BeautyGirl beautyGirl : girls) {
            System.out.println(beautyGirl);
        }

        Collections.sort(girls);
        System.out.println("排序一下---------------------------------------------");

        for (BeautyGirl beautyGirl : girls) {
            System.out.println(beautyGirl);
        }
    }

}

輸出結果例如以下

美女{年齡:28身高:170.0}
美女{年齡:25身高:183.0}
美女{年齡:28身高:180.3}
美女{年齡:32身高:170.0}
美女{年齡:21身高:170.0}
排序一下---------------------------------------------
美女{年齡:21身高:170.0}
美女{年齡:25身高:183.0}
美女{年齡:28身高:170.0}
美女{年齡:28身高:180.3}
美女{年齡:32身高:170.0}

Comparator

package com.mwq.comparator;

public class BeautyGirl {
    private int age;
    private Double height;

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Double getHeight() {
        return height;
    }

    public void setHeight(Double height) {
        this.height = height;
    }

    @Override
    public String toString() {
        return "美女{年齡:" + this.getAge() + "身高:" + this.getHeight() + "}";
    }

}
package com.mwq.comparator;

import java.util.Comparator;

/**
 * 實現美女的排序
 */
public class BeautyGirlComparator implements Comparator<BeautyGirl> {

    @Override
    public int compare(BeautyGirl girl1, BeautyGirl girl2) {
        // 姑且把年齡放在第一位
        if (girl1.getAge() == girl2.getAge()) {
            return compareHeight(girl1, girl2);
        } else {
            return girl1.getAge() - girl2.getAge();
        }
    }

    private int compareHeight(BeautyGirl girl1, BeautyGirl girl2) {
        // 把身高放在第二位
        return girl1.getHeight().compareTo(girl2.getHeight());
    }

}
Collections.sort(girls, new BeautyGirlComparator());

這樣是使用排序的時候,僅僅要你指定一個新的規則,就會依照新的規則來排序,而不須要再變更BeautyGirl類。

比如。你能夠依照身高優先、年齡次之的排序。

總結兩者的差別就在於排序規則的制定。假設排序規則善變。那麽使用comparator是個好辦法,假設規則固定,實現comparable更好,至少少寫一個類。

Java Comparable和Comparator