Comparable与Comparator的基本使用和区别

目录

前言

一、基本介绍

二、使用步骤

         (1)Comparable 的实现

(2)Comparator的实现

(3)测试

三.测试结果

总结


前言

     本文章是我自己听了课之后整理的笔记。


一、基本介绍

        Comparable是java.lang包下的一个接口。

  • 此接口对实现它的每个类的对象强加一个总排序。 这种排序被称为类的自然顺序 ,类的compareTo方法被称为其自然比较方法

  • 实现此接口的对象的列表(和数组)可以由Collections.sort (和Arrays.sort )自动排序。 实现该接口的对象,可以使用如sorted mapsorted set 这些有序的集合时,而不需要指定一个comparator

        Comparator是java.util包下的一个接口。

  • 通过实现一个比较器(实现了Comparator接口),它对某些对象集合施加总排序 。 可以将比较器传递给排序方法(例如Collections.sortArrays.sort ),以便精确控制排序顺序。 比较器还可用于控制某些数据结构的顺序(例如sorted setssorted maps ),或者为没有natural ordering的对象集合提供排序。

二、使用步骤

(1)Comparable 的实现

class Person1 implements Comparable<Person1>{
    private String name;    //名字
    private int age;        //年龄
    private double point;   //分数

    public Person1() {
    }

    public Person1(String name, int age, double point) {
        this.name = name;
        this.age = age;
        this.point = point;
    }

     @Override
    public int compareTo(Person1 o) {
        if(this.getPoint() > o.getPoint()){
            return 1;
        }else if(this.getPoint() < o.getPoint()){
            return -1;
        }else{
            if(this.getAge() > o.getAge()){
                return 1;
            }else if (this.getAge() < o.getAge()){
                return -1;
            }else {
                return 1;            //如果年龄成绩都相同,排序随意。我这里传1,也可传-1.但不能传0。因为会不存储。
            }
        }
    }
}  

      


(2)Comparator的实现

        比较器的实现:

class PersonComparator implements Comparator<Person>{

    @Override
    public int compare(Person o1, Person o2) {
        if(o1.getPoint() > o2.getPoint()){
            return 1;
        }else  if (o1.getPoint() < o2.getPoint()){
            return -1;
        }else {
            if (o1.getAge() > o2.getAge()){
                return 1;
            }else if (o1.getAge() < o2.getAge()){
                return -1;
            }else{
                return 1;             //这里返回负数正数都行,但不能返回0
            }
        }
    }
}

   Person类:

class Person{
    private String name;
    private int age;
    private double point;

    public Person() {
    }

    public Person(String name, int age, double point) {
        this.name = name;
        this.age = age;
        this.point = point;
    }
}

(3)测试

public class Demo3 {
    public static void main(String[] args) {
        TreeSet<Person1> treeSet = new TreeSet<>();
        Person1 p1 = new Person1("贾宝玉",14,88.5);
        Person1 p2 = new Person1("林黛玉",13,90.5);
        Person1 p3 = new Person1("史湘云",13,85);
        Person1 p4 = new Person1("贾宝钗",15,91);
        Person1 p5 = new Person1("hahha",15,88.5);
        treeSet.add(p1);
        treeSet.add(p2);
        treeSet.add(p3);
        treeSet.add(p4);
        treeSet.add(p5);
        for (Person p:treeSet) {
            System.out.println(p);
        }

        Person[] people = new Person[5];
        PersonComparator personComparator = new PersonComparator();
        people[0] = new Person("贾宝玉",14,88.5);
        people[1] = new Person("林黛玉",13,90.5);
        people[2] = new Person("史湘云",13,85);
        people[3] = new Person("贾宝钗",15,91);
        people[4] = new Person("hahha",15,88.5);

        Arrays.sort(people, personComparator);

        for (Person p:people) {
            System.out.println(p);
        }
    }
}

三.测试结果

 效果是一样的。

总结

        以上的就是Comparable和Comparator的基本使用。通俗的理解下就是Comparable是目标类自己实现该接口,Comparator是要通过一个比较器来实现该接口,然后在目标类比较的时候再把比较器传过去来控制比较的顺序。

至于两者的区别我也是网上看别人的博客理解的。这里贴一个链接:

https://www.cnblogs.com/xujian2014/p/5215082.html

这个我觉得很厉害,比我这篇更好理解。但我刚开始写,以后努力以这个为写博客的目标。

另外,如果有不足之处,无论内容还是博客格式,都可指出,我会改正!

                                                                                                                       我是所以,祝你幸福!


补充:

        compareTo方法 中的返回值分为三类:正数,零和负数。

  1. 正数:代表前者大,即排序的顺序靠前
  2. 负数:代表后者大,即排序的顺序靠前
  3. 零:代表一样大。(注意:在TreeSet这些顺序的集合中,返回0是不会把数存进集合中)

如:

这里的逻辑是当两人年龄和成绩都一样时,返回0。所以后存储的hahha就不再存进集合。

public class Demo3 {
    public static void main(String[] args) {
        TreeSet<Person1> treeSet = new TreeSet<>();
        Person1 p1 = new Person1("贾宝玉",14,88.5);
        Person1 p2 = new Person1("林黛玉",13,90.5);
        Person1 p3 = new Person1("史湘云",13,85);
        Person1 p4 = new Person1("贾宝钗",15,91);
        Person1 p5 = new Person1("hahha",14,88.5);
        treeSet.add(p1);
        treeSet.add(p2);
        treeSet.add(p3);
        treeSet.add(p4);
        treeSet.add(p5);
        for (Person1 p:treeSet) {
            System.out.println(p);
        }
    }
}

结果如下:

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值