[Java] 13.8. 比較器介面

Comparator比較器介面, 將物件的比大小邏輯抽離,要有多少不同的排序邏輯就有多少個不同的排序邏輯。

 

image/svg+xml13.8. 比較器介⾯ – Comparator Comparator 介⾯,讓您的員⼯物件擁有更多的排序外掛 import java.util.*; class Employee extends Person implements Comparable { String employeeID; int salary; // 略過⼀些程式 public int compareTo ( Object o ){ Employee p = (Employee)o; if ( this .salary > p.salary) return 1 ; if ( this .salary < p.salary) return - 1 ; return 0 ; } } import java.util.*; class NameComparator implements Comparator { public int compare ( Object o1 , Object o2 ){ Employee e1 = (Employee)o1; Employee e2 = (Employee)o2; return e1.name. compareTo (e2.name); } } import java.util.*; class AgeComparator implements Comparator { public int compare ( Object o1 , Object o2 ){ Employee e1 = (Employee)o1; Employee e2 = (Employee)o2; if (e1.age> e2.age) return 1 ; if (e1.age< e2.age) return - 1 ; return 0 ; } } import java.util.*; class Main{ public static void main( String [] args){ Employee e1 = new Employee ( "K12345678" , Jack " , 20 , " 男⽣ " , "048679" , 40000 ); Employee e2 = new Employee ( "K00000000" , " Eric " , 25 , " 男⽣ " , "041121" , 45000 ); Employee e3 = new Employee ( "K11111111" , " Mary " , 18 , " 女⽣ " , "050021" , 30000 ); Employee e4 = new Employee ( "K22222222" , " Jack " , 19 , " 男⽣ " , "051212" , 42000 ); List l = new ArrayList (); l.add ( e1 ); l.add ( e2 ); l.add ( e3 ); l.add ( e4 ); Collections.sort ( l , new NameComparator ()); for ( Object o : l){ Employee e = (Employee)o; System.out.println(e. name ); } Collections.sort ( l , new AgeComparator ()); for ( Object o : l){ Employee e = (Employee)o; System.out.println(e. age ); } } } 執⾏結果 Eric Jack Jack Mary 18 19 20 25 import java.util.*; class MainClass{ public static void main( String [] args){ Employee e1 = new Employee ( "K12345678" , Jack " , 20 , " 男⽣ " , "048679" , 40000 ); Employee e2 = new Employee ( "K00000000" , " Eric " , 25 , " 男⽣ " , "041121" , 45000 ); Employee e3 = new Employee ( "K11111111" , " Mary " , 18 , " 女⽣ " , "050021" , 30000 ); Employee e4 = new Employee ( "K22222222" , " Jack " , 19 , " 男⽣ " , "051212" , 42000 ); Employee [] ary = new Employee [ 4 ]; ary [ 0 ] = e1 ; ary [ 1 ] = e2 ; ary [ 2 ] = e3 ; ary [ 3 ] = e4 ; Arrays.sort ( ary , new NameComparator ()); for ( Object o : ary){ Employee e = (Employee)o; System.out.println(e. name ); } Arrays.sort ( ary , new AgeComparator ()); for ( Object o : ary){ Employee e = (Employee)o; System.out.println(e. age ); } } } 執⾏結果 Eric Jack Jack Mary 18 19 20 25 J13_8_1 Main.java 2. Comparable 介⾯提供了 compareTo() ⽅法,讓兩個員⼯物件可 以進⾏比⼤⼩,但問題是改寫的 comparaTo() ⽅法只有⼀個,若同時 有多個不同的比⼤⼩規則,那怎麼辦呢?例如除了⽬前以薪資的⽅式 比較⼤⼩外,若還需要以姓名或年齡進⾏比⼤⼩時,這時該怎麼辦? J13_8_2 Main.java 1. 這是員⼯類別( Employee ),其實作 Comparable 介⾯。 J13_8_2 NameComparator.java 1. 使⽤ Comparator compare() ⽅法。 2. 建立 1 個新的類別,取名為 NameComparator 表⽰這是員⼯姓名 -Name 的排序比較器。 3. 實作的是 Comparator 介⾯。 4. 改寫 compare() ⽅法,並 將排序的規則寫在此⽅法中。 5. compare() ⽅法有 2 個參數,這兩個參數就是 ⽤來存放要進⾏比較⼤⼩的兩個員⼯物件。 6. 記得員⼯類別( Employee )上的姓名( Name )屬性嗎!沒錯,姓名 屬性的型別是 String ,它是⼀個類別,同時也實作了 comparable ⾯,因此直接使⽤ String compareTo() ⽅法進⾏姓名的比⼤⼩的動 作。當然最後也是回傳整數,以代表⼤於、⼩於或等於的關係。 J13_8_2 AgeComparator.java 7. 這是另 1 個排序比較器,取名為 AgeComparator 表⽰這是以年齡作為排序準則的。 8. 同樣實作了 Comparator 介⾯。 9. 同樣實作 compare() ⽅法,並將比較的規則寫在這個⽅法中。 10. 比較 2 個員⼯物件的年齡( age ),⼤於回傳 1 ,⼩於回傳 -1 ,等於回傳 0 1. 建立 4 個員⼯物件,其擁有不同的姓名與薪資。 2. 使⽤實作 List 介⾯的 ArrayList 保存員⼯物件。 3. sort() ⽅法是多載的,另⼀個版本的 sort() ⽅法提供了第 2 個參數, 讓您放入第比較器物件,使⽤起來就像是排序的外掛⼀樣;就像給予 sort() ⽅法⼀個姓名比較器( NameComparator )物件,這時 sort() 法就會依照姓名比較器物件所規定的比較規則進⾏員⼯物件的排序。 4. 換個年齡比較器( AgeComparator ),則 sort() 法就會依照年齡比較器中的比較規則進⾏員⼯物件的排序。 J13_8_3 Main.java 1. 建立 4 個員⼯物件,其擁有不同的姓名與薪資。 2. 使⽤⼀般的陣列將員⼯物件保存在陣列中。 3. 同樣的⽅式適⽤在 Arrays 類別的 sort() ⽅法上,只需要將姓名比 較器( NameComparator )的物件交給 sort() ⽅法的第 2 個參數, sort() ⽅法就會依照姓名比較器的比較規則進⾏排序。 4. 換個年齡比較器( AgeComparator ),則 sort() ⽅法 就會依照年齡比較器中的比較規則進⾏員⼯物件的排序。 除了薪⽔排序外, 老闆還想要以姓名、年齡進⾏排序 啟動員⼯排序外掛的⽅式, 就是代入 Collections sort() ⽅法中 當然,員⼯排序外掛也可以 代入 Arrays sort() ⽅法中使⽤ 1 2 1 2

留言