博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java 之 Comparable vs Comparator
阅读量:7063 次
发布时间:2019-06-28

本文共 3520 字,大约阅读时间需要 11 分钟。

Comparable和Compator都是用于给集合排序的接口,但是他们之间的区别是什么呢。

  • Comparable: 这个接口只有一个方法compareTo。比如我们想通过年龄给用户排序,那么我们的用户要实现Comparable接口的方法,假如一旦要通过用户的评分进行排序,我们就必须要修改compareTo方法。
// o 是要比较的对象// 返回负数,小于要比较的对象// 返回 0 ,等于要比较的对象// 返回正数,大于要比较的对象public interface Comparable
{ public int compareTo(T o);}
  • Comparator: 这个接口有两个方法,equals和compare. 要进行比较的类不一定非要实现Comparator接口,由第三方的类实现这个接口来进行排序。 这样的话,排序的种类就可以有很多种,并且像对用户进行排序,我们可以通过年龄,姓名,评分等进行排序也不用修改用户类。我们要做的应该就是写 AgeComparator,NameComparator,RankComparator.
public interface Comparator
{// 返回负数,第一个小于第二个的对象,o1 < o2// 返回 0 ,对象相等 o1 = o2// 返回正数,第一个大于第二个对象 o1 > o2 int compare(T o1, T o2); // 判断Compator之间是不是相同的 boolean equals(Object obj);}

案例

通过Comaparable排序
  1. 如果是通过评分(rank)进行排序,User类写法如下
public class User implements Comparable
{ private Integer id; private Integer rank; private Integer age; private String name; //getter and setter public User(Integer rank, Integer age, String name) { this.rank = rank; this.age = age; this.name = name; } // 通过rank进行排序 @Override public int compareTo(User o) { return this.getRank() - o.getRank(); } @Override public String toString() { return "User{" + "id=" + id + ", name='" + name + '\'' + ", rank=" + rank + ", age=" + age + '}'; }}
  1. 如果想要通过年龄进行排序,那么就要修改User对象。
public class User implements Comparable
{ private Integer id; private Integer rank; private Integer age; private String name; //getter and setter public User(Integer rank, Integer age, String name) { this.rank = rank; this.age = age; this.name = name; } // 通过rank进行排序 @Override public int compareTo(User o) { return this.getAge() - o.getAge(); } @Override public String toString() { return "User{" + "id=" + id + ", name='" + name + '\'' + ", rank=" + rank + ", age=" + age + '}'; }}
  1. 写测试类。
public class App {    public static void main(String[] args) {        List
list = new ArrayList
(); list.add(new User("aihe",100,23)); list.add(new User("weidong",80,25)); list.add(new User("zhangbo",85,28)); list.add(new User("leizhen",90,29)); Collections.sort(list); System.out.println(list); }}
通过Comparator进行排序
  1. 如果是通过Rank进行排序,创建RankComparator类。
public class RankComparator implements Comparator
{ // 通过rank进行排序 public int compare(User o1, User o2) { return o1.getRank() - o2.getRank(); }}
  1. 如果是通过年龄进行排序,创建AgeComparator类。
public class AgeComparator implements Comparator
{ // 通过age进行排序 public int compare(User o1, User o2) { return o1.getAge() - o2.getAge(); }}
  1. 测试类。
public class App {    public static void main(String[] args) {        List
list = new ArrayList
(); list.add(new User("aihe",100,23)); list.add(new User("weidong",80,25)); list.add(new User("zhangbo",85,28)); list.add(new User("leizhen",90,29)); Collections.sort(list,new RankComparator()); //Collections.sort(list,new AgeComparator()); System.out.println(list); }}

小结

如果我们的排序方式一般不会变化,我们知道要排序什么字段,在创建对象的时候可以直接实现Comparable接口。

如果我们还不清楚要比较什么字段,那么可以等到后续确定的时候实现Comparator接口,Comparator接口是从外部进行排序,不会对对象产生影响。

参考

转载地址:http://ciill.baihongyu.com/

你可能感兴趣的文章
vue2的keep-alive的总结
查看>>
在部署asp.net时,会出现的两种情况,记下来,以方便以后解决问题。
查看>>
(转)http协议
查看>>
C#枚举-避免不合理赋值
查看>>
Setting up Unicorn with Nginx
查看>>
PHP——内测:联系人管理
查看>>
How can I create an executable JAR with dependencies using Maven?
查看>>
delphi提示错误行号之Assert(断言)
查看>>
springmvc 导出excel
查看>>
自行控制loadrunner的socket协议性能测试 (转)
查看>>
【ASP】简单Url编码和Url解码实例
查看>>
人工智能火了,为啥医疗成为最先受益者?
查看>>
雷军带领小米老员工公园步行 称这些人是小米最宝贵财富
查看>>
滴滴公布自查进展:免去黄洁莉顺风车事业部总经理职务
查看>>
中国PPP管理库项目累计投资额13.2万亿元
查看>>
甘肃崆峒古镇“文化赶集”:非遗“上台”贺新春
查看>>
俄罗斯食品来中国“过年”
查看>>
市场监管总局:保健食品应标注不具疾病预防治疗功能
查看>>
GitHub 上开源的区块链项目 90% 死亡了
查看>>
澳网张帅首夺大满贯 女双携斯托瑟挑落卫冕冠军
查看>>