可能是最简单最通透的Comparable和Comparator接口返回值理解

这篇具有很好参考价值的文章主要介绍了可能是最简单最通透的Comparable和Comparator接口返回值理解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

先说 Comparator 接口,这个理解了,下一个就理解了

一、Comparator 的用法(暂不考虑0,因为0不处理)

返回-1,1交换不交换位置,如果撇开比较器的两个参数和jdk默认顺序来说,存粹是错误的

接口如下:原文链接

public interface Comparator<T> {

    int compare(T o1, T o2);
}

现提出如下标准:

  • 标准1:jdk 默认要升序排列,即程序排序规则是 asc ,升序排列
  • 标准2:Comparator 接口第一个参数 o1 是第二个参数 o2 后面的对象

基于这 2 个标准,假设:

  • 1 = true
  • -1 = false

重点来了,有以下两种情况和处理方式:

  • 情况1:后面的比前面大,即 o1 > o2 ,是 标准1中的 升序 吗?是,返回 true,不交换前后位置。
  • 情况2:后面的比前面小,即 o1 < o2 ,是 标准1中的 升序 吗?不是,返回 false, 交换前后位置。

问:为什么第二种降序要交换前后位置?
答:因为 标准1 ,默认要对数组进行升序排列,如果发现降序的序列,自然要交换位置

扩散问题1:如果我想按降序排列呢?
答:那你就在升序时候返回 false,降序时候返回 true 就行

扩散问题2:如果我不比较,直接返回1或者-1呢?
答:因为标准1,返回1(true)代表都是升序,自然不必交换,返回-1(false)代表都不是升序,都要交换,即数组反转

总结:

想要升序排列,如果比较器2个参数是升序排列,就返回true,否则返回false即可
想要降序排列,如果比较器2个参数是降序排列,就返回true,否则返回false即可

附测试代码:

public class ComparatorDemo {

    private final int local;

    public ComparatorDemo(int local) {
        this.local = local;
    }

    @Override
    public String toString() {
        return "" + local;
    }

    public static void main(String[] args) {
        List<ComparatorDemo> asc = new ArrayList<>();

        asc.add(new ComparatorDemo(13));
        asc.add(new ComparatorDemo(3));
        asc.add(new ComparatorDemo(15));
        asc.add(new ComparatorDemo(18));

        // 我想升序排列
        asc.sort((second,first) -> {
            if(second.local > first.local){
                return 1; //是升序,返回true
            }else if(second.local < first.local){
                return -1; //是降序,返回false
            }else {
                return 0;
            }
        });

        System.out.print("升序数组:");
        System.out.println(asc);

        List<ComparatorDemo> desc = new ArrayList<>();

        desc.add(new ComparatorDemo(13));
        desc.add(new ComparatorDemo(3));
        desc.add(new ComparatorDemo(15));
        desc.add(new ComparatorDemo(18));

        // 我想降序排列
        desc.sort((o1,o2) -> {
            if(o1.local > o2.local){
                return -1; //不是降序,返回false
            }else if(o1.local < o2.local){
                return 1; //是降序,返回true
            }else {
                return 0;
            }
        });

        System.out.print("降序数组:");
        System.out.println(desc);
    }

}

二、Comparable 的用法(暂不考虑0,因为0不处理)

规则和 Comparator 一样,只需把当前 Comparable 实例当成Comparator#compare(T o1, T o2)第一个参数即可

测试代码:文章来源地址https://www.toymoban.com/news/detail-476725.html

public class ComparableImpl implements Comparable<ComparableImpl> {

    private final Integer local;

    public ComparableImpl(Integer num) {
        this.local = num;
    }

    @Override
    public String toString() {
        return "" + local;
    }

    @Override
    public int compareTo(ComparableImpl before) {
        if (local > before.local) {
            return 1; //是升序
        } else if (local < before.local) {
            return -1; //是降序
        }
        return 0;
    }

    public static void main(String[] args) {
        ComparableImpl[] ables = new ComparableImpl[]{
                new ComparableImpl(1),
                new ComparableImpl(13),
                new ComparableImpl(25),
                new ComparableImpl(4),
        };

        Arrays.sort(ables);

        System.out.println(Arrays.toString(ables));
    }

}

到了这里,关于可能是最简单最通透的Comparable和Comparator接口返回值理解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【微信小程序】微信小程序的接口调入 获取太阳码 根据返回值的类型进行接收,微信接口可能直接返回图片,也可能返回一个错误信息的json,同时兼容处理这两种情况

    在开发一个关于微信小程序的过程中,有一个这样的需求,要求生成微信小程序的太阳码,然而这个东西的请求方式我们是这样的:我作为后端服务去请求这个太阳码的二维码,然后将获取到的太阳码二维码的图片返回给小程序端进行接收,然后小程序端进行一个展示 原本以

    2024年02月04日
    浏览(47)
  • ES 8.x 系列教程:ES 8.0 服务安装(可能是最详细的ES 8教程)

    首先明确一点:我们的首要目的是要快速上手使用Elasticsearch(以下简称ES),安装和部署ES并非重点,企业中真正需要你去安装的可能性或者机会非常小。大家可以想一想,对于刚入职的你来说,公司内部一般来说都已经有了一套完整的技术架构,让你亲自动手搭建除非是公

    2024年01月24日
    浏览(32)
  • java~搞懂Comparable接口的compareTo方法

    Comparable 接口的 compareTo 方法的升序或降序取决于实现该接口的类的具体实现。按照惯例, compareTo 方法应该返回负数、零或正数来指示当前对象是小于、等于还是大于传入的对象。具体来说: 如果 this 对象小于传入的对象,则 compareTo 应该返回负数。 如果 this 对象等于传入的

    2024年02月09日
    浏览(28)
  • 内置函数式接口-Comparator

    【 美 /ˈkɑːmpəˌreɪtər; kəmˈpærətər/】 比较器 Compares its two arguments (o1,o2) for order,Returns a integer。 1、 negative integer, first argument is less than the second → 0 o1o2 2、 zero, first argument i, equal to than the second → =0 o1=o2 3、 positive integer ,first argument is greater than the second → 0 o1o2

    2024年02月15日
    浏览(23)
  • 【Java 基础篇】Java 自然排序:使用 Comparable 接口详解

    在 Java 编程中,我们经常需要对对象进行排序。为了实现排序,Java 提供了 java.lang.Comparable 接口,它允许我们定义对象之间的自然顺序。本篇博客将深入探讨如何使用 Comparable 接口来进行自然排序,包括接口的基本概念、使用示例以及一些常见问题的解决方法。 自然排序是一

    2024年02月04日
    浏览(29)
  • 【java常用接口】Comparator学习

    Comparator 是 Java 中的一个接口,用于定义对象之间的排序规则。它可以用于对集合中的对象进行排序,或者用于自定义排序算法。 对集合中的对象进行排序。 自定义排序算法。 结合 Stream流 实现更便捷的排序操作。 实现 Comparator 接口:创建一个类,实现 Comparator 接口,并重

    2024年01月21日
    浏览(55)
  • Java比较器(Comparator接口)

    1.当元素的类型没有实现java.lang.Comparable接口而又不方便修改代码,或者实现了java.lang.Comparable接口的排序规则不适合当前的操作,那么可以考虑使用 Comparator 的对象来排序 2.重写compare(Object o1,Object o2)方法,比较o1和o2的大小:如果方法返回正整数,则表示o1大于o2;如果返回

    2024年02月15日
    浏览(34)
  • Vue3通透教程【十三】TS简单类型详解

    专栏介绍: 凉哥作为 Vue 的忠实 粉丝输出过大量的 Vue 文章,应粉丝要求开始更新 Vue3 的相关技术文章,Vue 框架目前的地位大家应该都晓得,所谓三大框架使用人数最多,公司选型最多的框架,凉哥之前在文章中也提到过就是 Vue 框架之所以火起来的原因,和 Vue 框架相比其

    2024年02月05日
    浏览(35)
  • Vue3项目关于轮播图的封装应该怎么封装才是最简单的呢

    在Vue3中,可以使用组合API和ref来封装一个简单的轮播图组件。以下是一个基本的封装示例: 在模板中,使用v-for来遍历数据列表,并根据currentIndex来设置当前展示的轮播图。 在setup中,使用ref来定义currentIndex和timer变量。在onMounted和onUnmounted钩子中,分别启动和停止轮播循环

    2024年02月07日
    浏览(62)
  • Linux安装OpenCV——利用包管理器apt从源仓库安装(绝对是最简单的安装方法)

    以Ubuntu为例,打开终端,输入以下命令: 然后就装好了。可以在 下面找到装好的OpenCV库。cmake中使用下面几条语句以使用opencv: 打开终端,输入: 安装完毕后就可以使用了,终端输入: 需要注意的是,通过apt/yum等安装的opencv,一般不是最新版本。若需要安装你需要的版本

    2024年02月15日
    浏览(23)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包