JAVA Comparator 介面排序用法
阿新 • • 發佈:2019-02-07
java的比較器有兩類,分別是Comparable介面和Comparator介面。
在為物件陣列進行排序時,比較器的作用非常明顯,首先來講解Comparable介面。
讓需要進行排序的物件實現Comparable介面,重寫其中的compareTo(T o)方法,在其中定義排序規則,那麼就可以直接呼叫java.util.Arrays.sort()來排序物件陣列,例項如下:
在上面的程式中,實現了Comparable介面,並重寫了compareTo方法,將學生先按成績由大到小排名,成績相同時候按照年齡由低到高排序。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)就有兩個引數。
程式碼例項
上面依然是對student物件陣列進行排序,用的都是Array.sort方法,不同的是實現comparator介面時,sort方法需要傳進來兩個引數,即stu物件陣列,以及重寫的實現了comparator比較方法類。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); } } }
程式執行的結果和上面是一樣的
Array.sort是對陣列進行排序,假如我們不想使用陣列,想使用Collection介面下的集合,如想使用List,那麼需要稍微做些修改:
重寫的compare方法按照隨機生成的學生ID排序,其次按照數學成績排序,生成的結果是: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 stub if (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; else return 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 stub Random 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); } } }
全部的學生:
0zhangnan3 6778
0zhangnan2 390
2zhangnan1 5796
3zhangnan4 6253
在這裡我們沒有使用物件陣列,而是使用了Collection 介面下的ArrayList 集合,所以排序用的是Collections.sort(st,new ComparatorSort())