java的比較子有兩類,分別是Comparable介面和Comparator介面。
在為對象數組進行排序時,比較子的作用非常明顯,首先來講解Comparable介面。
讓需要進行排序的對象實現Comparable介面,重寫其中的compareTo(T o)方法,在其中定義定序,那麼就可以直接調用java.util.Arrays.sort()來排序對象數組,執行個體如下:
View Code
class Student implements Comparable<Student>{ private String name; private int age; private float score; public Student(String name, int age, float score) { this.name = name; this.age = age; this.score = score; } public String toString() { return name+"\t\t"+age+"\t\t"+score; } @Override public int compareTo(Student o) { // TODO Auto-generated method stub if(this.score>o.score)//score是private的,為什麼能夠直接調用,這是因為在Student類內部 return -1;//由高到底排序 else if(this.score<o.score) return 1; else{ if(this.age>o.age) return 1;//由底到高排序 else if(this.age<o.age) return -1; else return 0; } }}public class ComparableDemo01 { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Student stu[]={new Student("zhangsan",20,90.0f), new Student("lisi",22,90.0f), new Student("wangwu",20,99.0f), new Student("sunliu",22,100.0f)}; java.util.Arrays.sort(stu); for(Student s:stu) { System.out.println(s); } }}
程式運行結果:
sunliu 22 100.0
wangwu 20 99.0
zhangsan 20 90.0
lisi 22 90.0
但是在設計類的時候,往往沒有考慮到讓類實現Comparable介面,那麼我們就需要用到另外的一個比較子介面Comparator。
從上面的執行個體我們可以發現,compareTo(T o)只有一個參數,而Comparator介面中必須要實現的compare(T o1,T o2)就有兩個參數。
代碼執行個體:
View Code
package edu.sjtu.ist.comutil;import java.util.Comparator;class Student { private String name; private int age; private float score; public Student(String name, int age, float score) { this.name = name; this.age = age; this.score = score; } 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 float getScore() { return score; } public void setScore(float score) { this.score = score; } public String toString() { return name+"\t\t"+age+"\t\t"+score; }}class StudentComparator implements Comparator<Student>{ @Override public int compare(Student o1, Student o2) { // TODO Auto-generated method stub if(o1.getScore()>o2.getScore()) return -1; else if(o1.getScore()<o2.getScore()) return 1; else{ if(o1.getAge()>o2.getAge()) return 1; else if(o1.getAge()<o2.getAge()) return -1; else return 0; } } }public class ComparableDemo02 { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Student stu[]={new Student("zhangsan",20,90.0f), new Student("lisi",22,90.0f), new Student("wangwu",20,99.0f), new Student("sunliu",22,100.0f)}; java.util.Arrays.sort(stu,new StudentComparator()); for(Student s:stu) { System.out.println(s); } }}
上述程式的運行結果與代碼執行個體1一樣。