Java比較器
阿新 • • 發佈:2020-07-19
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介面)
- 當元素沒有實現Comparable介面而又不方便修改程式碼
- 實現了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介面對比
- Comparable介面方式一旦指定,保證Compareable介面實現類在任何位置都可以比較大小
- Comparator介面屬於臨時性的比較,什麼時候需要比較就臨時建立一下