Comparable和Comparator接口的区别

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时需要添加额外的比较方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值