# TreeSet進行物件排序,Comparator的用法 **Question:** ```java= class Vehicle{ int vno; String name; public Vehicle (int vno, String name) { this.vno = vno; this.name = name; } public String toString () { return vno + ":" + name; } } public class Test { public static void main(String[] args) { Set<Vehicle> vehicle = new TreeSet<Vehicle>(); vehicle.add(new Vehicle(10123, "Ford")); vehicle.add(new Vehicle(10124, "BMW")); System.out.println(vehicle); } } ``` **Console結果如下:** ```console Exception in thread "main" java.lang.ClassCastException: exam.ocpjp.v1.q023.Vehicle cannot be cast to java.lang.Comparable at java.util.TreeMap.compare(TreeMap.java:1294) at java.util.TreeMap.put(TreeMap.java:538) at java.util.TreeSet.add(TreeSet.java:255) at exam.ocpjp.v1.q023.Test.main(Test.java:23) ``` **會產生ClassCastException 因為TreeSet的元素必須要實作Comparable介面, 或是在宣告TreeSet時,實作Comparator方法才可以進行自動排序。** --- **以下是改良版:** ```java= import java.util.Comparator; import java.util.Set; import java.util.TreeSet; class Vehicle implements Comparable<Vehicle>{ int vno; String name; public Vehicle (int vno, String name) { this.vno = vno; this.name = name; } public String toString () { return vno + ":" + name; } @Override public int compareTo(Vehicle other) { return this.vno-other.vno; } } public class Test { public static void main(String[] args) { Set<Vehicle> vehicle = new TreeSet<Vehicle>(new Comparator<Vehicle>() { @Override public int compare(Vehicle o1, Vehicle o2) { return o1.vno-o2.vno; } }); vehicle.add(new Vehicle(10123, "Ford")); vehicle.add(new Vehicle(10124, "BMW")); System.out.println(vehicle); } } ``` **Console結果如下:** ```Console= [10123:Ford, 10124:BMW] ``` **TreeSet可以正常排序了** :::danger :bulb: Comparable有個compareTo()方法要實作,它會傳入一個物件,你要傳回大於0、0或小於0的數。 傳回大於0表示,傳入的物件順序上比目前物件大,應該排在後面,傳回0表示兩個物件順序上相等,傳回小於0 表示傳入的物件順序上比目前物件小,應該排在前面。 ::: **Question:** ```java= class Book implements Comparator<Book> { String name; double price; public Book(){ } public Book(String name, double price) { this.name = name; this.price = price; } public int compare(Book b1, Book b2) { return b1.name.compareTo(b2.name); } public String toString() { return name + ":" + price; } } public class Test { public static void main(String[] args) { List<Book>books = Arrays.asList (new Book ("Beginning with Java", 2),new Book("A Guide to Java Tour", 3)); Collections.sort(books, new Book()); System.out.print(books); } } ``` **Console:** ```Console= [A Guide to Java Tour:3.0, Beginning with Java:2.0] ``` ###### tags: `ocpjp`