java.util.Comparator接口容易被实现并使用,但是在Comparator的API文档里有些部分还是应当仔细阅读一下的。
实现了Comparator接口的类可以传给例如Collections.sort这样的排序方法。它们也可以被Map或者Set类使用,用来保证Map或者Set里的元素始终是按某种顺序排列的。TreeSet和TreeMap就是这样的类。
在Comparator接口里,只有一个方法是需要实现的:
int compare(Object o1,Object o2);如果o1小于o2,返回一个负数;如果o1大于o2,返回一个正数;如果他们相等,则返回0;
这些就是通常为了完成比较所要做的一切,但是在Comparator接口的契约里还有别的义务。
首先,compare方法一定要是对称的,意思是compare(a,b)返回的结果要跟compare(b,a)相反。相反的结果意味着,要么返回的值带有不同的正负号,要么都是0。注意,象compare(a,b)返回4而compare(b,a)返回-2这样的情况是合法的。方法里常常可能抛出异常,在这个方法里抛出异常也要是对称的。如果调用compare(a,b)时抛出了一个ClassCastException异常,那么调用compare(b,a)时也必须抛出一个ClassCastException异常。
public abstract class Car {
protected String name;
protected int price;
protected String Brand;
public abstract double depriciation();
}
public class CarComoarator implements Comparator<Car> {
public int compare(Car o1, Car o2) {
int a = (int)(((Car)o1).depriciation());
int b = (int)(((Car)o2).depriciation());
return b-a;
}
}
public class NegonCar extends Car {
public double depriciation() {
return this.price * 0.10;
}
}
public class SUVCar extends Car {
public double depriciation() {
return this.price * 0.15;
}
}
public class Test {
public static void main(String[] args) {
Car car1 = new SUVCar();
car1.price = 40000;
Car car2 = new NegonCar();
car2.price = 30000;
List<Car> beforeSort = new ArrayList();
beforeSort.add(car1); beforeSort.add(car2);
for (Iterator iterator = beforeSort.iterator(); iterator.hasNext();) {
Car car = (Car) iterator.next();
System.out.print(car.depriciation());
}
System.out.println();
sortCar(beforeSort); for (Iterator iterator = beforeSort.iterator();
iterator.hasNext();) { Car car = (Car) iterator.next();
System.out.print(car.depriciation()); }
}
public static void sortCar(List list) {
Collections.sort(list, new CarComoarator());
}
}