文章目錄

  • 給對象數組排序
  • Arrays.sort() 和 Comparable
  • Comparator

給對象數組排序

Arrays.sort() 和 Comparable

  • 我們之前介紹過直接使用Arrays.sort() 來為數組排序,傳入數組對象即可,按數值大小排序。

但是有時我們會遇到自定義類型數組,那此時自定義類型中可能有多種數據類型,再使用Arrays.sort() 時它該按怎樣的規則來比較呢?

  • 這時就需要我們自行指定比較規則了,否則報錯。其實在Arrays.sort()內部會自動調用一個接口–Comparable,利用接口方法compareTo()的比較規則和sort()自身的排序算法來對數組排序。
  • 此時在被排序對象的所屬類中需要實現Comparable接口,並在類中重寫compareTo()方法,定義自己的比較規則。
class Student implements Comparable {
private String name;
private int score;
public Student(String name, int score) {
this. name = name;
this. score = score;
}
//請注意compareTo方法標籤原型,參數類型為Object類
@Override
public int compareTo(Object o) {
Student s = (Student)o;
if (this. score > s. score) {
return -1;
} else if (this. score < s. score) {
return 1;
} else {
return 0;
     }
   }
}
  • 在被排序類中直接實現compareTo方法;
    方法中當 this.數據>=參數.數據時返回非負整數,否則(小於)返回負整數,那麼默認就是按對應數據升序排序。

之後再去使用Arrays.sort()來為數組(Student[])排序

Arrays. sort(students);
System.out.println(Arrays.toString(students));

開始學習時我會有個疑問,我們不應該用Comparable接口引用來調用compareTo嗎? 但是怎麼直接用Arrays.sort了呢?

  • 其實sort()有多個重載類型,其中一個重載類型的參數類型就是Comparable[],Comparable[]來接受數組對象,然後調用compareTo(),這樣疑問就解答了。

Comparator

在使用Comparable接口時,我們是在被排序類中實現了compareTo來對數組進行排序。這樣的話就將排序規則寫死了,對這個類進行排序就只能用這一種規則。而且在原生類中突然寫個compareTo方法在一定程度上會破壞類的結構,比如此類就是來封裝用户數據上,而卻寫了個比較方法,結構不統一。

為了解決以上問題我們就可以使用Comparator接口

  • 與Comparable接口不同,我們要再定義一個類,用這個類對實現Comparator接口,在此類內部重寫compare方法。而這個實現了Comparator接口的類叫做比較器,然後使用這個比較器來對數據排序,這樣我們可以定義多個不同比較器,靈活調用。以下為詳細解析:

實現接口:

//定義一個類AgeComparator,來根據Student類中的年齡屬性排序Student類型數組
public class AgeComparator implements Comparator<Student>
//< > 中的 Student 是要排序的數組元素類型
@Override
publicint compare(Student o1, Student o2) {
return o1.age - o2.age;
}

先來看使用compare方法時的注意事項:

  1. compare方法有兩個參數,類型均為接口後緊跟的(Comparator)數組元素類型 Student
  2. 當方法中邏輯為o1.數據>=o2.數據時返回非負整數,否則(小於)返回負整數,那麼默認就是按對應數據升序排序。

上面我們講到使用不同的比較器來對數組對象進行不同規則的排序,那怎麼使用我們定義好的比較器呢?

其實還是使用Arrays.sort()方法

  • 我們之前説過其實sort()有多個重載類型,第一個是直接傳入數組對象,利用Comparable接口,sort()方法自動調用compareTo方法。
  • 而另一個重載類型是有兩個參數,第一個參數還是數組對象,第二個就是我們的比較器,這樣sort()根據我們傳入的不同比較器來對數組進行不同類型的排序。
//用Comparator的實現類(比較器)創建一個對象
AgeComparator ageComparator = new AgeComparator();
//對數組根據學生的年齡升序排序
Arrays.sort(students,ageComparator);