Java中comparable接口和comparator接口都是自定义实现排序的两个接口的。他们的主要区别是什么呢?下来看两个例子说明问题:
我们有一个对象Book,他有两个属性,分别是name和price;
public class book {
private int price;
private String name;
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
现在我们想根据Book的单价进行排序,如果comparable接口和comparator接口,分别应该怎么实现呢?
1.利用comparable接口:
如果采用comparable接口,则Book类必须去实现comparable接口,即类中实现:
public class book implements Comparable{
private int price;
private String name;
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public int compareTo(Object o) {
return this.price-((book)o).price;
}
}
可以看见,comparable中的函数comparaTo只有一个参数o,说明另一个比较的参数就是它本身。
在比较时候直接采用Collecions.sort(); 因为比较的规则已经在book类内实现。
2.利用comparator接口
实现comparator接口是不用更改book类的,它是在book类外实现的。看代码:
public class Book1 {
private int price;
private String name;
public Book1(int price,String name){
this.price=price;
this.name=name;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class comparator {
public static void main(String[] args) {
// TODO Auto-generated method stub
// TODO Auto-generated method stub
List<Book1> list = new ArrayList<Book1>();
list.add(new Book1("1",1));
list.add(new Book1("22",22));
list.add(new Book1("11",11));
list.add(new Book1("13",13));
Collections.sort(list,new Comparator<Object>(){
@Override
public int compare(Object o1, Object o2) {
// TODO Auto-generated method stub
return ((Book1)o1).getPrice()-((Book1)o2).getPrice();
}
});
for(Book1 b:list){
System.out.println(b.getName());
}
}
}
我们可以发现comprator接口的compara函数分别有两个参数,也就是两个需要比较的参数,分别为o1和o2,他们在Book1的外部实现
在实现的时候,需要采用Collection.sort(list, new Comparator(){});由于Book1类中没有实现任何的比较规则,所以在用Collections.sort时需要添加额外的比较方法。