JAVA Comparator 介面排序用法__JAVA

來源:互聯網
上載者:User

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())



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.