1. 程式人生 > 實用技巧 >Java比較器

Java比較器

Java比較器

Comparable介面(自然排序)

String、包裝類等排序

像String、包裝類等實現了Comparable介面,進而重寫了compareTo()方法,給出了比較兩個物件大小的方式(從小到大的排列)

  • compareTo(obj)重寫規則
    • 如果當前物件this大於形參物件obj,則返回正整數
    • 如果當前物件this小於形參物件obj,則返回負整數
    • 如果當前物件this等於形參物件obj,則返回0

自定義類排序

對於自定義類來說,如果需要排序。可以讓自定義類實現comparable介面,重寫CompareTo(obj)方法

  • 在compareTo(obj)方法中指明如何排序
    • 首先判斷資料是否可以轉化為同一型別(資料型別轉換)
    • 判斷當前物件和形參物件資料大小關係
      • 如果當前物件this大於形參物件obj,則返回正整數
      • 如果當前物件this小於形參物件obj,則返回負整數
      • 如果當前物件this等於形參物件obj,則返回0

程式碼實現

按照年齡從小到大進行排列

public class Test {
    public static void main(String[] args) {
        Student[] arr = new Student[4];
        arr[0] = new Student("Tom",18,100);
        arr[1] = new Student("Jack",23,60);
        arr[2] = new Student("Ann",20,41);
        arr[3] = new Student("Lisa",21,82);

        Arrays.sort(arr);

        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }

    }
}

class Student implements Comparable {
    private String name;
    private int age;
    private double grade;

    public Student() {

    }

    public Student(String name, int age, double grade) {
        this.name = name;
        this.age = age;
        this.grade = grade;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

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

    public double getGrade() {
        return grade;
    }

    public void setGrade(double grade) {
        this.grade = grade;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", grade=" + grade +
                '}';
    }

    @Override
    public int compareTo(Object o) {
        //資料進行型別轉換
        if(o instanceof Student){
            Student s = (Student)o;
            //進行比較
            if(s.getAge() > this.getAge()){
                return -1;
            }else if(s.getAge() < this.getAge()){
                return 1;
            }else{
                return 0;
            }
        }else{
            throw new RuntimeException("傳入資料型別不一致");
        }

    }
}

執行結果

Comparator介面(定製排序)

背景(以下情況使用Comparator介面)

  1. 當元素沒有實現Comparable介面而又不方便修改程式碼
  2. 實現了Comparable介面的排序規則不適合當前操作

重寫compare方法

重寫compare(Object o1,Object o2)方法,比較o1和o2的大小

  • 如果o1大於o2,則返回正整數
  • 如果o1小於o2,則返回負整數
  • 如果o1等於o2,則返回0

String類重寫

程式碼實現

public void test1(){
    String[] s = new String[]{"AA","YY","NN","EE","XX"};
    Arrays.sort(s, new Comparator() {
        @Override
        public int compare(Object o1 , Object o2) {
            if(o1 instanceof String || o2 instanceof String){
                String s1 = (String)o1;
                String s2 = (String)o2;

                if(s1.equals(s2)){
                    return 0;
                }else{
                    return - s1.compareTo(s2);
                    }
                }
            else{
                throw new RuntimeException("傳入資料型別不一致");
            }
        }
    });

    System.out.println(Arrays.toString(s));
}

執行結果

自定義類重寫

程式碼實現

Comparable介面和Comparator介面對比

  1. Comparable介面方式一旦指定,保證Compareable介面實現類在任何位置都可以比較大小
  2. Comparator介面屬於臨時性的比較,什麼時候需要比較就臨時建立一下