[Java] 13.6. 可比較介面

可比較介面Comparable,讓你的物件彼此之間可以比大小,好在集合中進行排序。

 

image/svg+xml13.6. 可比較介⾯ – Comparable 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 ); PriorityQueue q = new PriorityQueue (); q.offer ( e1 ); q.offer ( e2 ); } } 執⾏結果 Exception in thread "main" java.lang.ClassCastException: Employee cannot be cast to java.lang.Comparable at java.util.PriorityQueue.siftUpComparable(PriorityQueue.java:652) at java.util.PriorityQueue.siftUp(PriorityQueue.java:647) at java.util.PriorityQueue.offer(PriorityQueue.java: 344) at Main.main(Main.java:10) ( 負數 ) ⼩於的關係 0 相等的關係 ( 正數 ) ⼤於的關係 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 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 ); PriorityQueue q = new PriorityQueue (); q.offer ( e1 ); q.offer ( e2 ); q.offer ( e3 ); q.offer ( e4 ); Object temp = null ; while ((temp= q.poll ()) != null ){ Employee e = (Employee)temp; System.out.print(e.name); System.out.println( ":" + e. salary ); } } } 執⾏結果 Mary 30000 Jack 40000 Jack 42000 Eric 45000 Set 集合改寫 Object 類別所繼承下來的 equals() ⽅法,以制定物件之間是否相同的規則;對於 Hash 眼開頭的集合類別,表⽰其將會以雜湊的⽅式的將物件保存在集合中,因此必須所寫繼承⾃ Object 別的 hashCode() ⽅法,如此在進⾏雜湊保存物件的情況下,才能依雜湊的代號找到相同的物件,也才 能夠進⼀步的比較是否有相同的物件存在於同⼀個集合中;⽽若要⾃訂類別也⽀援排序的功能,這時 就要實作 Comparable 介⾯,如此物件和物件之間才能夠比較⼤⼩,以決定排列的先後順序。下表針對 集合若要透過 contains() ⽅法確認物件是否已存在時,所需要改寫的⽅法有哪些;另外,標⽰出⽀援排 序的集合,若將⾃訂物件放入其中時,⾃訂物件是否需要實作 Comparable 介⾯。 集合類別 equals() hashCode() Comparable List List List List ArrayList V LinkedList V Set Set Set Set HashSet V V LinkedHashSet V V TreeSet V V V Map (針對要作為 Key 的類別) Hashtable V V HashMap V V LinkedHashMap V V TreeMap V V 集合類別 equals() hashCode() Comparable J13_6_1 Main.java 1. 建立 2 個員⼯物件,其擁有不同的薪資( salary )。 J13_6_2 Main.java 2. 建立 PriorityQueue 物件,希望能夠依薪資⼤⼩將員⼯物件進⾏排序。 3. 當加入第 2 個員⼯物件時就會發⽣異常,異常中指出 PriorityQueue 會將放入的物 件進⾏排序,因此先轉型成 Comparable 介⾯型別進⾏物件之間誰⼤誰⼩的比較,以決定先 後序;但因為我們的員⼯類別並沒有實作 Comparable 介⾯,所以會發⽣轉型失敗的異常。 J13_6_2 Employee.java 1. 這是員⼯類別( Employee )。 2. 實作 Comparable 介⾯,並實作 CompareTo() ⽅法, 讓員⼯物件有比較⼤⼩的能⼒。 3. compareTo() ⽅法有 1 個參數,⽤來 讓員⼯物件主動呼叫 compareTo () 法,與另⼀個員⼯物件進⾏比較。 4. 以薪資作為比較員⼯物件⼤⼩的條件。 ⼤於時回傳正數 1 ;⼩於時回傳負數 -1 5. ⼤於也不⼩於時,那就是等於了,所以回傳 0 1. 建立 4 個員⼯物件,其擁有不同的薪資。 2. 建立 PriorityQueue 物件,希望能夠依薪資⼤⼩將員⼯物件進⾏排序。 3. 加入 4 個員⼯物件⾄ PriorityQueue 中。 4. 透過 poll() ⽅法依序取員⼯物件,現在員⼯物件會以 薪資⼤⼩的⽅式進⾏排列,由薪資⼩的排列⾄薪資⼤的。 Comparable 介⾯也⽀援泛型,關於泛型會在 “14 - 保證集合中裝的物件 - 泛型 中說明到。 員⼯物件也想在 PriorityQueue 依照薪資進⾏排序? 1 1 Comparable 介⾯讓員⼯物件,可以薪⽔作為比較⼤⼩的基準 比⼤⼩的能⼒決定員⼯物件如何在 PriorityQueue 中排序 集合特性總整理

留言