第一次寫博客,正好在回顧Java的時候用到了比較器,記錄一下使用的方法。 Java比較器多用於對象數組的排序,主要用到comparable和comparator介面 1、使用comparable介面 首先將需要實現排序對象的類實現comparable介面,實現後覆寫comparaTo(T other ...
第一次寫博客,正好在回顧Java的時候用到了比較器,記錄一下使用的方法。
Java比較器多用於對象數組的排序,主要用到comparable和comparator介面
1、使用comparable介面
首先將需要實現排序對象的類實現comparable介面,實現後覆寫comparaTo(T other)方法,在comparaTo方法中寫出比較規則,最後調用java.utils.Arrays.sort()方法傳入需要比較的對象數組即可排序。
測試如下:
1 import java.util.Arrays; 2 3 public class Main { 4 5 public static void main(String[] args) { 6 7 Student[] arr = new Student[3]; 8 arr[0] = new Student(3); 9 arr[1] = new Student(2); 10 arr[2] = new Student(1); 11 for( Student a : arr ) 12 System.out.print(a+" "); 13 Arrays.sort(arr); 14 System.out.println(); 15 for( Student a : arr ) 16 System.out.print(a+" "); 17 } 18 } 19 20 class Student implements Comparable<Student>{ 21 22 int number; 23 24 public Student(int aNumber){ 25 this.number = aNumber; 26 } 27 28 public int compareTo(Student o){//對象自身與o比較,返回1的話,被比較的對象將會排在前面。 29 if(this.number > o.number){ 30 return 1; 31 }else if(this.number == o.number){ 32 return 0; 33 }else 34 return -1; 35 } 36 37 public String toString(){ 38 return String.valueOf(number); 39 } 40 41 }
運行結果為:
3 2 1
1 2 3
註:
比較時,若想要從大到小排序,將排序方式中的1更換成-1,-1更換成1即可。
=======================================
2、使用comparator介面
有時,在設計Student類時沒有考慮到實現Comparable介面,可自己編寫一個比較器類.
創建一個比較器類,實現comparator<T>介面,覆寫compare(T o1,T o2)方法,最後在調用Arrays.sort()時傳入要排序的數組和比較器類即可
測試如下:
1 package practice; 2 import java.util.Arrays; 3 import java.util.Comparator; 4 5 public class Main { 6 7 public static void main(String[] args) { 8 9 Student[] arr = new Student[3]; 10 arr[0] = new Student(1,3); 11 arr[1] = new Student(3,5); 12 arr[2] = new Student(2,5); 13 for( Student a : arr ) 14 System.out.print(a+"\t"); 15 Arrays.sort(arr,new StudentComparator()); //傳入數組和比較器類 16 System.out.println(); 17 for( Student a : arr ) 18 System.out.print(a+"\t"); 19 } 20 } 21 22 class Student{ 23 24 int number; //學號 25 int score; //分數 26 27 public Student(int aNumber,int aScore){ 28 this.number = aNumber; 29 this.score = aScore; 30 } 31 32 public String toString(){ 33 return number+"號分數:"+score; 34 } 35 36 } 37 38 class StudentComparator implements Comparator<Student>{ 39 40 public int compare(Student o1, Student o2) { //在編寫時添加了新比較規則,分數高的在前,若分數相同,學號大的在前。 41 if(o1.score > o2.score) 42 return -1; 43 else if(o1.score < o2.score) 44 return 1; 45 else{ 46 if(o1.number > o2.number) 47 return -1; 48 else if(o1.number < o2.number) 49 return 1; 50 else 51 return 0; 52 } 53 } 54 55 }
運行結果:
1號分數:3 3號分數:5 2號分數:5
3號分數:5 2號分數:5 1號分數:3
上面的方法也可以像本次測試一樣,修改比較規則,實現不同排序效果。
=======================================
如果想為集合類排序,與第二種方法類似,在調用Collections.sort(st,new ComparatorSort())時傳入集合和比較器即可。