1. 程式人生 > 實用技巧 >Java(28)java比較器

Java(28)java比較器

JAVA比較器

java的比較器主要分為兩種,第一種是實現Comparable介面的內部比較器,第二種是實現Comparator介面的外部比較器。

Comparabel介面的部分原始碼如下:

public interface Comparable<T> {
    public int compareTo(T o);
}

Comparator介面的部分原始碼如下:

public interface Comparator<T> {
    int compare(T o1, T o2);
}

內部比較器--Comparable介面

Comparable介面位於java.lang

包下。

當需要對某個類(可以是自己定義的)的物件進行排序時候,則需要實現Comparable這個介面,然後重寫compareTo方法。我們的類實現這個介面和重寫方法後,就可以使用Array.sort()對這個類的例項物件陣列進行排序,或者使用Collection.sort對這個類的物件List集合進行排序。我們需要在compareTo方法裡定義我們的排序規則。注意:自定義類的時候最好重寫頂級父類ObjecttoString()方法。

案例1:內部比較器

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

public class Employee implements Comparable<Employee> { //這裡記得要指定泛型
    private String name;
    private int id;
    private long salary;

    public Employee(String name, int id, long salary) {
        this.name = name;
        this.id = id;
        this.salary = salary;
    }

    @Override
    public int compareTo(Employee o) {
        if (this.salary > o.salary) {
            return (1);
        } else if (this.salary < o.salary) {
            return (-1);
        } else {
            return (0);
        }
    }
    //預設的toString()方法,呼叫頂級父類Object的toString()方法
//    @Override
//    public String toString() {
//        return super.toString();
//    }

    //super.toString(),父類Object的toString原始碼如下,該方法預設返回類名和hashCode相關資訊
//    public String toString() {
//        return getClass().getName() + "@" + Integer.toHexString(hashCode());
//    }

    //重寫toString()方法

    @Override
    public String toString() {
        return (this.name+"\t"+this.id+"\t"+this.salary);
    }
}

class RunClass {
    public static void main(String[] args) {
        Employee[] ems = {
                new Employee("zhansan", 23522, 20000),
                new Employee("lisi", 23436, 24000),
                new Employee("laowang", 235634, 10000)
        };
        System.out.println("===============使用Arrays.sort()來進行排序");
        //排序前
        for(Employee e:ems){
            System.out.println(e.toString());
        }
        Arrays.sort(ems);
        System.out.println("==============");
        //排序後
        for(Employee e:ems){
            System.out.println(e.toString());
        }

        System.out.println("===============使用Arrays.sort()來進行排序");
        List<Employee> myList=new ArrayList<Employee>();
        myList.add(new Employee("zhansan", 23522, 20000));
        myList.add(new Employee("lisi", 23436, 24000));
        myList.add(new Employee("lisi", 23436, 24000));
        //排序前
        for(Employee e:ems){
            System.out.println(e.toString());
        }
        Collections.sort(myList);
        System.out.println("==============");
        //排序後
        for(Employee e:ems){
            System.out.println(e.toString());
        }

    }
}

執行輸出結果如下:

===============使用Arrays.sort()來進行排序
zhansan	23522	20000
lisi	23436	24000
laowang	235634	10000
==============
laowang	235634	10000
zhansan	23522	20000
lisi	23436	24000
===============使用Arrays.sort()來進行排序
laowang	235634	10000
zhansan	23522	20000
lisi	23436	24000
==============
laowang	235634	10000
zhansan	23522	20000
lisi	23436	24000

外部比較器--Comparator介面

Comparator介面位於java.util包下。

Comparator介面是一個跟Comparable介面功能很相近的比較器。比較大的區別是,實現該介面的類一般是一個獨立的類。詳情看程式碼:

import java.util.*;

class Employee{
    private String name;
    private int age;
    private long salary;
    public Employee(String name,int age,long salary){
        this.salary=salary;
        this.name=name;
        this.age=age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public long getSalary() {
        return salary;
    }

    @Override
    public String toString() {
        return this.name+"\t"+this.age+"\t"+this.salary;
    }
}
//建立年齡比較器:
class AgeComparator implements Comparator<Employee>{

    @Override
    public int compare(Employee o1, Employee o2) {
        if (o1.getAge()>o2.getAge()){
            return 1;
        }else if(o1.getAge()<o2.getAge()){
            return -1;
        }else {
            return 0;
        }
    }
}
//建立薪水比較器:
class SalaryComparator implements Comparator<Employee>{

    @Override
    public int compare(Employee o1, Employee o2) {
        if (o1.getSalary() > o2.getSalary()) {
            return 1;
        } else if (o1.getSalary() < o2.getSalary()) {
            return -1;
        } else {
            return 0;
        }
    }
}

class RunClass {
    public static void main(String[] args) {
        Employee[] ems = {
                new Employee("zhansan", 26, 30000),
                new Employee("lisi",14, 24000),
                new Employee("laowang",40, 10000)
        };
        System.out.println("===============使用薪水比較器來進行排序");
        //排序前
        for(Employee e:ems){
            System.out.println(e.toString());
        }
        Arrays.sort(ems,new SalaryComparator());  //使用薪水比較器進行排序
        System.out.println("==============");
        //排序後
        for(Employee e:ems){
            System.out.println(e.toString());
        }

        System.out.println("===============使用年齡比較器來進行排序");
        List<Employee> myList=new ArrayList<Employee>();
        myList.add(new Employee("zhansan", 23522, 20000));
        myList.add(new Employee("lisi", 23436, 24000));
        myList.add(new Employee("lisi", 23436, 24000));
        //排序前
        for(Employee e:ems){
            System.out.println(e.toString());
        }
        Collections.sort(myList,new AgeComparator()); //使用年齡比較器進行排序

        System.out.println("==============");
        //排序後
        for(Employee e:ems){
            System.out.println(e.toString());
        }

    }
}

執行輸出結果如下:

===============使用薪水比較器來進行排序
zhansan	26	30000
lisi	14	24000
laowang	40	10000
==============
laowang	40	10000
lisi	14	24000
zhansan	26	30000
===============使用年齡比較器來進行排序
laowang	40	10000
lisi	14	24000
zhansan	26	30000
==============
laowang	40	10000
lisi	14	24000
zhansan	26	30000

內部與外部比較器的區別

如果定義一個類的時候,沒有考慮到排序的問題,即沒有實現Comparable介面,那麼就可以通過實現Comparator介面來來進行自定義排序。Comparator可以方便使用不同的排序規則,更加靈活一點。