关于自然排序Comparable 和 比较器排序Comparator

简要区别

自然排序可用在list和set中,当用在list集合中时要通过Collections(list)对排序规则进行调用,谁是最后一个排序的就按照哪个排序规则进行排序
当用在TreeSet集合中时(TreeSet集合就是为了排序存在的),如果没有比较器排序存在,那么就一定要让Student类实现Comparable接口,要不然会报错,如果是按照比较器进行排序,student类就不用实现Comparable接口了

public class TestTreeSet1 {
	public static void main(String[] args) {
		TreeSet set = new TreeSet();

		List<Student> list = new ArrayList<Student>();
		Student s = new Student(4, "jack");
		Student s2 = new Student(2, "hello");
		Student s3 = new Student(1, "bob");
		Student s4 = new Student(3, "gm");
		/*
		 * set.add(s); set.add(s2); set.add(s3); set.add(s4);
		 */
		// 若将student对象添加到list集合中,要调用Collections.sort()方法实现对象排序
		list.add(s);
		list.add(s2);
		list.add(s3);
		list.add(s4);
		/*
		 * 什么是自然排序,就是我们要实现排序的对象事先实现Comparable接口,重写compareTo(Object o)方法,对于list集合
		 * 可以通过Collections.sort(list)按自然之前定好的自然排序规则进行排序,底层原理是Collection.sort(
		 * list)方法会调用 Comparable接口的实现类的compareTo(Object o)方法进行排序(在list集合中进行排序)
		 * 
		 */
		Collections.sort(list);

		/*
		 * 也可以通过自己重写一个比较器(匿名内部类),按照比较器的compare(Object o1,Object
		 * o2)方法的比较规则进行定制排序, collection.sort(list,new
		 * Comparator()),最后底层会调用到compare(Object o1,Object
		 * o2方法在list集合中将对象元素进行排序
		 * 
		 */
		Collections.sort(list, new Comparator<Student>() {

			@Override
			public int compare(Student o1, Student o2) {

				return o1.id - o2.id;
			}

		});

		for (Student student : list) {
			System.out.println(student + ",");
		}
		// 遍历方法一
		/*
		 * for(Object o:set) 
                                    System.out.println(o);
		 * System.out.println("-----------"); 
                                //遍历方法二 Iterator
		 * iter=set.iterator(); 
                                     while(iter.hasNext()) {
		 * System.out.println(iter.next().toString()); }
		 */

	}

}

/**
 * TreeSet集合中添加2个Err对象,添加第一个对象时,TreeSet里没有任何元素,所以没有问题;当添加第二个Err对象时,
 * TreeSet就会调用该对象的compareTo(Object obj)方法与集合中其他元素进行比较——如果对应的类
 * 没有实现Comparable接口,则会引发ClassCastException异常。而且当试图从TreeSet中取出元素第一个元素时,
 * 依然会引发ClassCastException异常。
 * 
 * 关于TreeSet是如何根据Comparable实现类的compareTo(Object
 * o)方法的排序规则或比较器Comparator的compare实现排序的:
 * TreeSet底层是TreeMap,TreeSet的add()方法添加student对象元素时,会调用TreeMap的put()方法,
 * put方法中,如果比较器排序不为空的话,就调用 比较器对象Comparator中的compare(Object o1,Object o2)方法,
 * 将元素按照排序规则放置到红黑树的左边或右边
 * 如果比较器对象为空,再按照student对象中重写的compareTo(Object o)方法再红黑树上边添加元素边排序(比较器排序优先于自然排序)
 * 
 * @author lenovo
 *
 */

class Student implements Comparable {
	public int id;
	public String name;

	public Student(Integer id, String name) {
		this.id = id;
		this.name = name;
	}

	public int compareTo(Object o) {
		Student s = (Student) o;
		if (this.name.length() == s.name.length())
			return -(this.name.charAt(0) - s.name.charAt(0));

		return -(this.name.length() - s.name.length());

	}

	@Override
	public String toString() {
		return "Student [id=" + id + ", name=" + name + "]";
	}

}  
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值