java中comparator 和comparable 的差别

comparable

comparable是一个结接口,如果某一个类实现类此接口,就代表该类支持排序。
必须使用compareTo方法。

public class Student implements Comparable {
     String name;
     public int compareTo(Student another) {
         return name.compareTo(another.name); 
     }

	// 比较两个对象
	student1.compareTo(student2);
	
	// 排序数组或集合
	Arrays.sort(students);
	Collections.sort(collection);
	}

Comparator

若某一个类并没有comparable接口,但想进行排序。可以通过new 一个comparator 来完成。(通过自己新生成的comparator类。常常使用lamda表达式完成。

通过compare方法。
这样是按照成绩降序排列:

	public int compare(Student a, Student b) {
		return b.getScore() - a.getScore();
//		int nameDiff = a.getFirstName().compareTo(b.getFirstName());
//		return nameDiff;
	}

这样是按照成绩升序排列:

	public int compare(Student a, Student b) {
		return a.getScore() - b.getScore();
//		int nameDiff = a.getFirstName().compareTo(b.getFirstName());
//		return nameDiff;
	}

如果使用lamda表达式,可以省去(new coparator),这样是升序排列:

Arrays.sort(studentArr,(a,b) -> a.score - b.score);

如果使用priorityQueue 的时候, 这是最小堆(最小的再最上边)

PriorityQueue<Interval> pq = new PriorityQueue<>((Interval a,Interval b)-> a.end - b.end);

区别

comparable
  • 内部比较器 Comparable 是排序接口,只包含一个函数 compareTo();若一个类实现了 Comparable 接口,就意味着 “该类支持排序”,它可以直接通过 Arrays.sort() 或 Collections.sort() 进行排序。
  • 如果比较的方法只要用在一个类中,用该类实现 Comparable 接口就可以。
comparator
  • 外部比较器 Comparator 是比较器接口,单独实现第一个比较器,不需要对原来的类进行结构上的变化,属于无侵入式的;一个类实现了 Comparator 接口,那么它就是一个 “比较器”。其它的类,可以根据该比较器去排序。
  • 如果比较的方法在很多类中需要用到,就自己写个类实现 Comparator 接口,这样当要比较的时候把实现了Comparator 接口的类传过去就可以,省得重复造轮子。这也是为什么 Comparator 会在 java.util 包下的原因。

使用 Comparator 的优点:

  1. 与实体类分离
  2. 方便应对多变的排序规则,可以同时使用多种排序标准

部分引用自:
作者:杰哥长得帅
链接:https://www.jianshu.com/p/323d120c6dae
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值