# 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`