java零基础入门-Comparable vs Comparator(下)

哈喽,各位小伙伴们好,我是喵手。

        今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流学习,互相学习,才能成长的更快,对吧。

        我是一名java开发,所以日常接触到最多的就是java啦,所以我趁自己有空,就来好好回忆,把自己学到的会的,进行输出,不图什么有回报,只想能帮助到更多的小伙伴,就好。

        小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对喵手我创作道路上最好的鼓励与支持!

一、前言

        论前几期啊,我们是分别讲了Object类Date类FormDate类Calendar类System类StringBuilder类,不知道大家掌握的如何,如果没有及时巩固的同学,可以看我这里,我给大家罗列了下,快速学习通道,只希望能帮助到大家更好的学习与成长,这就是我写作的初衷。

       在前几期,我们是有讲过Collection类的,不知道大家还是否有印象,我们都知道,Collection分为两类,一类是单列集合,一类是双列集合。

       而今天我们就来讲一期Collections工具集使用的下篇,(Collections其包位置:java.utils.Collections),它?与Collection类?不要误解,Collections是一集合工具类,用来对集合进行一系列操作的工具类。

二、正文

1、Comparable

        在上一期,我是重点介绍了Comparable接口及它所提供的compareTo()方法,不知道大家还是否有印象了。其实你们主要知道它是强制排序,不能修改类的代码实现自己想要的排序,局限性比较大,这就可以了。

        但是一般情况,还是足够你正常使用了。而对于集合中得对象进行排序,不能直接通过Collections.sort(),而还是得Comparable接口。

2、Comparator

        与Comparable不同的是,不仅包路径不同(Comparator位于java.util包下,而Comparable位于java.lang包下),而且实现排序方式也比较宽限,像Comparator可以自定义指定排序规则,比如按年龄排序,按首字母排序等,这些都可以被你自定义使用。

        说了这么多,那你们肯定会觉得非常枯燥,都是概念总结,没关系呀,接下来就非常硬核了。我会结合实例来给大家演示他们之间分别如何使用且实例运用到以上概念点,目的就是为了帮助大家在对于这块知识盲区下能有个好的系统性学习。

三、实例演示

        接下来我分别实例演示一下Comparable接口如何使用及Comparator如何使用好吧。大家可得好好看

1、Comparable

        由于Comparable对于基本类型包装类及一些Date等类都有实现该Comparable接口。那么重点就在于它所实现类中的CompareTo()方法。

public interface Comparator<T>{

    int compare(T o1, T o2);

    boolean equals(Object obj);
}

接下来我演示一下Integer类及Date类如何使用的。

Integer类,我们可以看到,该类源码开头位置就是直接实现了Comparable接口。

 接下来,我就具体实例演示使用一下。

演示代码如下:

    @Test
    public void testSortComparableByInteger() throws ParseException {

        //获取当前时间
        Integer num1 = 5;
        System.out.println("num1= " + num1);

        //定义一个num2与num1进行比较
        Integer num2 = 20;
        System.out.println("num2= " + num2);

        //比较数值大小,若两相等返回0,大于返回1,小于返回-1。
        int compare = num1.compareTo(num2);
        System.out.println("num1与num2比较结果为:" + compare);
    }

执行结果截图如下:

 接下来就为大家演示Date()类。

演示代码如下:

    @Test
    public void testSortComparableByDate() throws ParseException {

        //获取当前时间
        Date date = new Date();
        System.out.println("time1= " + date);

        //定义一个时间与当前时间进行比较
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        Date privateDate = format.parse("2022-05-25");
        System.out.println("time2= " + privateDate);

        //比较时间大小,若两相等返回0,大于返回1,小于返回-1。
        int res = date.compareTo(privateDate);
        System.out.println("time1与time2比较结果为:" + res);
    }

执行结果截图如下:

        还有些其他的实例我就不一一列举了,剩下的就靠大家自己去依葫芦画瓢啦。 

2、Comparator

        如上我演示完了Comparable接口的使用比较方法,接下来我就为大家讲解下Comparator的比价使用了。

首先我们先来创建个对象,给该对象加上有age等属性。这样后续演示我就可以以对象中的age等属性进行排序了。其中演示就以用户实体类为例。

UserEntity.java

/**
 * 用户基本信息实体
 */
@TableName("user")
@Data
public class UserEntity implements Serializable {

    private static final long serialVersionUID = 1L;

    @TableId(value = "id", type = IdType.AUTO) //表示该id为自增,新增时候不需要手动设置id。
    private Integer id;

    @TableField(value = "name")
    private String name;

    @TableField(value = "age")
    private Integer age;

    @TableField(value = "sex")
    private String sex;

    @TableField(value = "address")
    private String address;

    @TableField(value = "describes")
    private String describes;


    //重写toString
    @Override
    public String toString() {
        return "id=" + this.id + " ," + "name=" + this.name + " ," + "age=" + this.getAge();
    }

    //无参构造函数
    public UserEntity() {
    }

    //有参构造
    public UserEntity(Integer id, String name, Integer age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }
}

 接下来我们就直接写个test测试类,我也是图方便好演示。

演示代码如下: 

    @Test
    public void testComparatorSort() throws ParseException {

        List<UserEntity> list = new ArrayList<>();

        //创建4个用户添加到list中
        list.add(new UserEntity(1, "赵云", 30));
        list.add(new UserEntity(2, "貂蝉", 10));
        list.add(new UserEntity(3, "李白", 20));
        list.add(new UserEntity(4, "黄忠", 60));

        System.out.println("排序前:" + list);

        //按对象中的age倒序排序
        list.sort(new Comparator<UserEntity>() {
            @Override
            public int compare(UserEntity o1, UserEntity o2) {
                return o2.getAge() - o1.getAge(); //降序
            }
        });

        System.out.println("排序后:" + list);
    }

具体执行结果截图如下:

         很明显是不是按对象中的age进行倒序排列了,你也可以换成别的属性,总之就是这么玩得,然后还有一点,其实你也可以在该实体类中去实现该Comparable接口,然后实现该CompareTo方法即可,比如如下演示:仅供参考

/**
 * 用户基本信息实体
 */
@TableName("user")
public class UserEntity implements Serializable, Comparable<UserEntity> {

    private static final long serialVersionUID = 1L;

    @TableId(value = "id", type = IdType.AUTO) //表示该id为自增,新增时候不需要手动设置id。
    private Integer id;

    @TableField(value = "name")
    private String name;

    @TableField(value = "age")
    private Integer age;

    //省略一些get set 构造函数。


    //实现compareTo接口
    @Override
    public int compareTo(UserEntity o) {
        return o.age - this.age; //倒序
    }
}

        然后你在代码中,就无需现场实现Comparator接口的compare()方法了。你只需要调用Collections的sort()排序方法就可以了,因为它会优先执行找到该对象中所实现的Comparable接口中的compareTo()方法。

    @Test
    public void testComparatorSort() throws ParseException {

        List<UserEntity> list = new ArrayList<>();

        //创建4个用户添加到list中
        list.add(new UserEntity(1, "赵云", 30));
        list.add(new UserEntity(2, "貂蝉", 10));
        list.add(new UserEntity(3, "李白", 20));
        list.add(new UserEntity(4, "黄忠", 60));

        System.out.println("排序前:" + list);
        Collections.sort(list);

        System.out.println("排序后:" + list);
}

执行结果如下:

 比如我们再换成通过age升序试试

        以上两种定义方法排序都可以,就看你的需求是怎么样的了。

        你也可以混用,其实就是自定义的排序规则是可以覆盖你在该对象中所实现的Comparable接口的compareTo()排序规则。其实这就是两种排序规则了。

        可以看下集合自带的sort()方法实现源码。

        ... ...

       好啦,以上就是本期内容的全部教学内容啦,如果对文中的任何知识点有疑问,欢迎评论区评论留言呀,我看见都会一一解答的。

四、文末

       教学是结束了,但是有些话不知我但讲不当讲,啊哈哈, 可我还是想说给你们听听。如下是我很喜欢的一句话,我打算送给你们,希望我们都能变得更好更优秀。

学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!

wished for you successed !!!

-------------------------------------------

⭐️若喜欢我,就请关注我叭。

⭐️若对您有用,就请点赞叭。

⭐️若有疑问,就请评论留言告诉我叭。

-------------------------------------------

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值