首页 > 其他分享 >可能是最简单最通透的Comparable和Comparator接口返回值理解

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

时间:2023-06-09 10:58:35浏览次数:57  
标签:Comparable return Comparator 降序 new 升序 返回值 local public

先说 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)第一个参数即可

测试代码:

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,return,Comparator,降序,new,升序,返回值,local,public
From: https://www.cnblogs.com/qnlcy/p/17468411.html

相关文章

  • java Comparator.comparing 排序异常
    今天在Java中使用 Comparator.comparing方法排序时遇到一个异常,明明已经使用了Comparator.comparing从小到大排序,但是1-10以内的顺序还好,>10的时候排序就乱了代码如下:List<MyRouteLongitudeAndLatitudeVo>collectVos=myRouteLongitudeAndLatitudeVos......
  • 第六节3函数的返回值
    在Python中,函数可以通过返回值来向调用者传递处理结果。返回值是指当函数执行完成后,将一个或多个结果返回给调用者的值。在Python中,函数的返回值可以通过return语句来实现。return语句用于指定函数返回的值,并且在执行该语句后,函数将会立即退出,不再执行下面的代码。如果没有使用re......
  • c++ 关于函数返回值问题
    c++中,当函数返回基本元素时,一般不会产生异常情况。但是当返回引用或指针时,即不使用值传递而是引用或指针传递来实现,那么需注意:不能返回函数内部的局部变量指针或引用。因为局部变量是在栈上,当离开函数作用域时,其内容会失效,相应的返回的指针或引用指向的内容就没有意义了。不能返......
  • -> 函数返回值注解符号
    ->出现在python函数定义的函数名后面,为函数添加元数据,描述函数的返回类型->函数返回值注解符号defadd(x,y)->int:#返回值注解表明了函数的返回值为int类型returnx+y......
  • 函数返回值与指向对象的指针和引用
    定义一个指向对象的指针或则引用不会调用构造函数和析构函数。首先,强调一点,和函数传参一样,函数返回时也会做一个拷贝。从某种角度上看,和传参一样,也分为三种:(1)返回值:返回任意类型的数据类型,会将返回数据做一个拷贝(副本)赋值给变量(return语句后边的变量会生成一个副本给一个临......
  • Spring Boot实现xml传参和返回值
    阅读文本大概需要3分钟。    虽然json作为数据传输的格式大型其道,但是使用xml格式传输的系统还是在一些存量的系统中存在。另外WebService本身就是使用xml格式进行数据传输。今天用个小例子看看SpringBoot如何实现xml传参和返回值。1、新建maven项目,添加依赖1.<projectxm......
  • python获取threading多线程的return返回值
    转载:(15条消息)python获取threading多线程的return返回值_pythonthreading返回值_星火燎愿的博客-CSDN博客我们正常使用threading模块创建的线程是无法获取它所执行方法的返回值的;如:w=threading.Thread(target=worker,args=(i,))一、重写线程,获取线程return返回值要想获......
  • 编译器绕过拷贝构造函数和返回值优化
    写在前面:在拷贝初始化(也就是用等号初始化,注意使用拷贝构造函数创建一个新的对象不属于拷贝初始化)过程中,编译器可以(但不是必须)跳过拷贝构造函数或者移动构造函数,直接创建对象。1stringnull_book="999";2//可以改写为3stringnull_book("999");这里面”999“隐式的转换为......
  • "以API接口快速获得aliexpress速卖通商品详情-返回值说明
     为了方便商家获取速卖通上的商品信息,速卖通提供了API接口来获取商品数据。本文将介绍如何通过API接口获取速卖通商品数据。一、申请API接口权限在使用API接口前,首先需要在速卖通官网注册账号并通过实名认证。然后,在个人资料页面找到开发者中心,申请API接口权限。在申请权限时,需要......
  • 【python】函数返回值,返回多个值(返回元组)
    函数返回值,返回多个值(返回元组)实例1:#定义函数,有多个返回值(返回元组)defmeasure():"""测量温度和湿度"""print("测量开始...")temp=39wetness=50print("测量结束...")#元组-可以包含多个数据,因此可以使用元组让函数一次返回多个值......