Java_Comparable 和 Comparator ——恋天小结

想要让TreeSet集合中元素进行排序 有三种方式
1要添加的元素对应的类实现java.lang.Comparable接口,并实现compareTo方法
2 让SortedSet集合做到排序还有一种方法,java.util.Comparator比较器类
3 写一个匿名内部类 ,还是 java.util.Comparator

默认的一些类型中,都实现了比较器,比如Date,String,Integer等等
所以 我们自定义类一个数据类型的时候(类),当需要对这个类对象进行排序,就需要我们自定义比较器,用于比较

如果 两种排序方式都有的话,优先使用compare()方法
源码中是这样调用的,先判断有没有compare(),如果没有再去执行compareTo(),在TreeMap类中的1294行

Comparable
我们叫做元素自身的比较器,就是要添加的元素需要实现这个接口,这种情况下一般用于我们自定义的类中
Comparator
比较器类,常应用于:比如Integer是默认升序,我想降序,就需要使用Comparator来重新设置排序,因为它的优先级高

如果添加的元素不是我们自定义的类,
1 该类有排序(实现了Comparable), 但不是我们想要的排序效果,需要使用 Comparator 来进行调整排序,因为它的优先级高
2 如果该类没有排序(没有实现Comparable),我们就需要使用Comparator来设置排序,因为这个时候我们不可能去更改人家的源
码,不可能让这个类去实现Comparable的

如果一个类没有实现Comparable接口,那么把对象放到list中之后,不能直接调用sort(list)进行排序
但是可以使用sort的方法重载,sort(list,比较器类),来实现对list的排序

public class Collection_11_SortedSet {

	public static void main(String[] args) {
	//	SortedSet products = new TreeSet(new ProductComparator());
		SortedSet products = new TreeSet(new Comparator() {
		
		  	public int compare(Object o1, Object o2) {
		  		//o1是要添加的元素
		  		//o2是集合中的元素
		  		double price1 = ((Product1)o1).price;
		  		double price2 = ((Product1)o2).price;
		  		if(price1 == price2) {
		  			return 0;
		  		}else if(price1 > price2) {
		  			return 1;
		  		}else {
		  			return -1;
		  		}
		  	}
		

	});
	Product1 p1 = new Product1(1.5);
	Product1 p2 = new Product1(2.2);
	Product1 p3 = new Product1(0.5);
	
	products.add(p1);
	products.add(p2);
	products.add(p3);
	System.out.println(products);
}
	

}
class Product1{
	double price;
	
	public Product1(double price) {
		super();
		this.price = price;
	}


	public String toString() {
		return "Produvt1[price=" + price + "]";
	}
}

//class ProductComparator implements Comparator{
//
//	@Override
//	public int compare(Object o1, Object o2) {
//		// o1是要添加的元素
//		// o2是集合中的元素
//		double price1 = ((Product1)o1).price;
//		double price2 = ((Product1)o2).price;
//		if (price1 == price2) {
//			return 0;
//		}else if (price1 > price2) {
//			return 1;
//		}else {
//			return -1;
//		}
//	}
//	
//}
public class Collection_12_SortedList {

	public static void main(String[] args) {
		ArrayList list = new ArrayList();
		list.add(new User1(18));
		list.add(new User1(14));
		list.add(new User1(20));
		
		Collections.sort(list,new Comparator(){
			
			public int compare(Object o1, Object o2) {
				return ((User1)o1).age - ((User1)o2).age;
			}
		});
		System.out.println(list);
	}

}

class User1{
	int age;
	
	public User1(int age) {
		super();
		this.age = age;
	}
	
	public String toString() {
		return "User1 [age=" + age + "]";
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值