java的比較子有兩類,分別是Comparable介面和Comparator介面。
在為對象數組進行排序時,比較子的作用非常明顯,首先來講解Comparable介面。
讓需要進行排序的對象實現Comparable介面,重寫其中的compareTo(T o)方法,在其中定義定序,那麼就可以直接調用java.util.Arrays.sort()來排序對象數組,執行個體如下:
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); } }} 在上面的程式中,實現了Comparable介面,並重寫了compareTo方法,將學生先按成績由大到小排名,成績相同時候按照年齡由低到高排序。
執行的結果是
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)就有兩個參數。
代碼執行個體
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); } }}上面依然是對student對象數組進行排序,用的都是Array.sort方法,不同的是實現comparator介面時,sort方法需要傳進來兩個參數,即stu對象數組,以及重寫的實現了comparator比較方法類。
程式啟動並執行結果和上面是一樣的
Array.sort是對數組進行排序,假如我們不想使用數組,想使用Collection介面下的集合,如想使用List,那麼需要稍微做些修改:
package comparatorTest;/** * 定義一個學生類 * 包括學號,姓名,數學成績,語文成績 * @author zhangnan * */public class Student{private String Name;private int ID;private int scoreMath;private int scoreChi;public Student (String name,int ID,int score1,int score2){this.Name=name;this.ID=ID;this.scoreMath=score1;this.scoreChi=score2;}public String getName(){return this.Name;}public void setName(String pname){this.Name=pname;}public int getID(){return this.ID;}public void setID(int pID){this.ID=pID;}public int getMathScore(){return scoreMath;}public void setMathScore(int score1){this.scoreMath=score1;}public float getChiScore(){return scoreChi;}public void setChiScore(int score2){this.scoreChi=score2;}/** * 返回學生資訊 */public String toString(){return Integer.toString(ID)+"\t\t"+Name+"\t\t"+Integer.toString(scoreMath)+"\t\t"+Integer.toString(scoreChi);}}--------------------------------------------------------------------------------package comparatorTest;import java.util.Comparator;public class ComparatorSort implements Comparator {public int compare(Student s1, Student s2) {// TODO Auto-generated method stubif (s1.getID() > s2.getID()) {return 1;} else if (s1.getID() < s2.getID()) {return -1;} else {if (s1.getMathScore() > s2.getMathScore())return -1;else if (s1.getMathScore() < s2.getMathScore())return 1;elsereturn 0;}}}--------------------------------------------------------------------------------package comparatorTest;import java.util.ArrayList;import java.util.Collections;import java.util.Random;public class test {public static void main(String[] args) {// TODO Auto-generated method stubRandom random=new Random();ArrayList st=new ArrayList();Student s1= new Student("zhangnan1",random.nextInt(10),random.nextInt(100),random.nextInt(100));Student s2= new Student("zhangnan2",random.nextInt(10),random.nextInt(100),random.nextInt(100));Student s3= new Student("zhangnan3",random.nextInt(10),random.nextInt(100),random.nextInt(100));Student s4= new Student("zhangnan4",random.nextInt(10),random.nextInt(100),random.nextInt(100));st.add(s1);st.add(s2);st.add(s3);st.add(s4);System.out.println("全部的學生:");Collections.sort(st,new ComparatorSort());for(Student s:st){System.out.println(s);}}} 重寫的compare方法按照隨機產生的學生ID排序,其次按照數學成績排序,產生的結果是:
全部的學生:
0 zhangnan3 67 78
0 zhangnan2 39 0
2 zhangnan1 57 96
3 zhangnan4 62 53 在這裡我們沒有使用對象數組,而是使用了Collection 介面下的ArrayList 集合,所以排序用的是 Collections.sort(st,new ComparatorSort())