Java中Comparator的个人简单理解(升序降序)与使用

article/2025/7/22 5:47:10

目录

  • Java自定义排序返回值简单记忆理解
  • 实践
    • LInkedList
      • 升序(默认情况)
      • 降序
    • PriorityQueue
      • 升序下的小顶堆(默认情况)
      • 降序下的大顶堆
  • 总结
  • 补充数组类型自定义排序
      • 降序排序 数组

Java自定义排序返回值简单记忆理解

默认情况下:Java实现Comparator排序是升序,即自然排序
根据参数,返回值来判断是否交换

对于a,b两个参数(a在前,b在后)
jdk官方的升序基于:

< return -1
> return 1
= return 0

降序就是反过来

< return 1
> return -1
= return 0

简单记忆: 把-1理解为false,1理解为true(实际上底层源码并不是这样,实现原理参考dalao的博客,只是为了方便记忆使用)
如果要升序:那么a<b就是想要的顺序,所以return -1 ,false,不交换
如果要降序:那么a<b就是不想要的顺序,所以return 1,true,要交换
简而言之,返回1的时候进行位置交换

实践

分别对LinkedList和PriorityQueue进行测试

LInkedList

升序(默认情况)

LinkedList<Integer> list = new LinkedList<Integer>();list.add(2);list.add(9);list.add(7);list.add(5);list.add(3);list.add(1);list.add(0);Collections.sort(list, new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {if(o1>o2) return 1;else if(o1<o2) return -1;else return 0;}});System.out.println(list);

结果
在这里插入图片描述
简化代码

//可以使用LinkedList继承自List的sort方法
list.sort(new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {if (o1 > o2) return 1;else if (o1 < o2) return -1;else return 0;}});//中间的自定义比较可以用Integer中的compareTo函数代替
list.sort(new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {return o1.compareTo(o2);}
});

使用lambda表达式进一步简化

//lambda
list.sort((a,b) ->{if(a>b) return 1;else if(a<b) return -1;else return 0;
});
//lambda+compareTo()/compare()
list.sort((a,b) ->{return a.compareTo(b);
});
list.sort((a,b)->{return Integer.compare(a,b);
});
//lambda指向静态函数
list.sort(Integer::compareTo);
list.sort(Integer::compare);

直接调用Comparator中的naturalOrder()

list.sort(Comparator.naturalOrder());

降序

a,b交换一下顺序即可

直接使用lambda表达式+compare()/compareTo()

list.sort((a,b) ->{return b.compareTo(a);
});
list.sort((a,b) ->{return Integer.compare(b,a);
});

直接调用Comparator中的reverseOrder()

list.sort(Comparator.reverseOrder());

结果
在这里插入图片描述

PriorityQueue

优先队列默认结构为二叉小顶堆(层序遍历)
小顶堆:每个结点的值都小于或等于其左右孩子结点的值
大顶堆:每个结点的值都大于或等于其左右孩子结点的值

不清楚优先队列的同学建议先看一下这位dalao的博客

升序下的小顶堆(默认情况)

使用lambda表达式+compare()/compareTo()

PriorityQueue<Integer> queue = new PriorityQueue<>((a,b) ->{return Integer.compare(a,b);//return a.compareTo(b);
});queue.offer(1);queue.offer(9);queue.offer(5);queue.offer(6);queue.offer(8);System.out.println(queue);

结果
在这里插入图片描述
画图抽象出对应的二叉树结构
在这里插入图片描述
当然可以写成这三种形式

PriorityQueue<Integer> queue = new PriorityQueue<>(Integer::compare);
PriorityQueue<Integer> queue = new PriorityQueue<>(Integer::compareTo);
PriorityQueue<Integer> queue = new PriorityQueue<>(Comparator.naturalOrder());

降序下的大顶堆

排序规则改变之后,变成二叉大顶堆

PriorityQueue<Integer> queue = new PriorityQueue<>((a,b) ->{return Integer.compare(b,a);//return b.compareTo(a);
});

当然还可以写成

PriorityQueue<Integer> queue = new PriorityQueue<>(Comparator.reverseOrder());

结果
在这里插入图片描述
用画图抽象出对应的二叉树结构
在这里插入图片描述

总结

  • 自定义排序规则时,需要交换则返回1,不需要交换时返回-1,相等返回0。
  • 若使用lambda表达式,设定参数a,b初始顺序 与 调用函数传参顺序一致时 默认排序,即升序;位置相反时,则降序

2021/05/19

补充数组类型自定义排序

降序排序 数组

Integer[] arr = {1,2,3,4,5};
Arrays.sort(arr , (a,b) -> b-a);

当然还可以用Comparator这样写

Arrays.sort(arr, Comparator.reverseOrder());
Arrays.sort(arr, (a, b) -> b.compareTo(a));

注意:这里是必须要使用包装类型的,否则不能使用 sort 方法,因为 排序器只能对引用类型排序,而int,double等都是 primitive type (基本类型)就必须要包装成 Integer,Double 才可以


http://chatgpt.dhexx.cn/article/eWZKnvae.shtml

相关文章

深度残差收缩网络(从信号降噪的角度进行理解)

本文探讨了深度残差收缩网络的另一种理解方式。 传统信号降噪算法的常见步骤是&#xff1a; ① 采用某种信号变换方法&#xff08;例如小波、经验模态分解&#xff09;&#xff0c;将含噪信号变换到另外一种形态&#xff08;例如小波系数、本征模态分量等&#xff09;。在这些…

NIPS 2016 深度学习 迁移学习 ---残差转移网络用于无监督领域自适应

深度学习的成功得益于大量的标注数据&#xff0c;而数据标注是非常消耗资源的。当一个问题中缺少标注数据时&#xff0c;可以从另一个源中所学知识迁移过来&#xff0c;并且用于新问题中。 清华大学的学者提出了一种新的方法&#xff08;https://arxiv.org/pdf/1602.04433.pdf&…

深度残差网络+自适应参数化ReLU激活函数(调参记录21)Cifar10~95.12%

本文在调参记录20的基础上,将残差模块的个数,从27个增加到60个,继续测试深度残差网络ResNet+自适应参数化ReLU激活函数在Cifar10数据集上的表现。 自适应参数化ReLU函数被放在了残差模块的第二个卷积层之后,这与Squeeze-and-Excitation Networks或者深度残差收缩网络是相似…

已知两个长度分别为m 和 n 的升序链表,合并降序链表,求时间复杂度

王道数据结构上一道题&#xff1a; 之前我看到一个电子版的书&#xff0c;上边答案解析写的有点错误&#xff0c; 听说有些同学买的实体书上&#xff0c;答案解析也是这样写的 这个是刊印错误&#xff0c;很显然2Max( m , n )大于等于 m n 而且这个解析也不够清晰。 解析&a…

波束形成 常见自适应波束形成算法信(干)噪比增益影响因素

0、其他补充 均匀线阵波束形成器的信噪比增益上确界可由下式表示&#xff1a; 其中为阵元数&#xff0c;所以为了方便起见&#xff0c;一般的稳健自适应波束形成算法在仿真过程中的阵元数量均设置为10。 阵列的导向矢量可由下式表示&#xff1a; 以首个阵元为参考阵元&#xff…

两个升序链表合并成一个降序链表的时间复杂度

王道考研P7 第六题 【2013年统考真题】已知两个长度分别为m和n的升序链表&#xff0c;若将它们合并为长度为mn的一个降序链表&#xff0c;则最坏情况下的时间复杂度是&#xff08;&#xff09; A. O(n) B. O(mn) C. O(min(m,n)) D. O(max(m,n)) 答案是D 注意&#xff0c;此题…

无线传感器网络路由优化中的能量均衡LEACH改进算法

文章目录 一、理论基础1、LEACH算法概述2、改进的LEACH算法 二、算法流程图三、仿真实验与分析四、参考文献 一、理论基础 1、LEACH算法概述 请参考这里。 2、改进的LEACH算法 改进的LEACH算法&#xff08;LEACH-N&#xff09;主要针对LEACH算法分簇阶段的缺陷而改进的&…

机器学习之自适应增强(Adaboost)

1.Adaboost简介 **Adaptive boosting(自适应增强)是一种迭代算法&#xff0c;其核心思想是针对同一个训练集训练不同的弱分类器&#xff0c;然后把这些弱分类器集合起来&#xff0c;构成一个强分类器&#xff0c;Adaboost可处理分类和回归问题。了解Adaboost算法之前&#xff…

自适应阈值(adaptiveThreshold)分割原理及实现

背景介绍及原理 前面介绍了OTSU算法和最大熵算法&#xff0c;但这两种算法都属于全局阈值法&#xff0c;所以对于某些光照不均的图像&#xff0c;这种全局阈值分割的方法会显得苍白无力&#xff0c;如下图&#xff1a; 显然&#xff0c;这样的阈值处理结果不是我们想要的&…

优化算法+神经网络:神经网络自动参数优化

当智能群优化算法遇上神经网络 优化算法进行神经网络的参数寻优&#xff0c;解放深度调参1.已经实现的Genetic Algorithm优化Neural Network2.已经实现的PSO优化Neural Network3.已实现的SSA[^1]优化Neural Network 三种方法的可视化搜索过程对比三种优化算法性能总结总结目前来…

Java stream().sorted()实现排序(升序、降序、多字段排序)

1 自然排序 sorted()&#xff1a;自然排序&#xff0c;流中元素需实现Comparable接口 package com.entity;import lombok.*;Data ToString AllArgsConstructor NoArgsConstructor public class Student implements Comparable<Student> {private int id;private String …

linux centos查找某个文件,Linux查找命令(文件、文件中的关键字)

1、grep &#xff1a;查找文件中的内容 $ grep [option] pattern [file] 例&#xff1a; $ grep un day Sunday 例: $grep include doulinked.c doulinked1.c doulinked.c:#include doulinked.c:#include doulinked.c:#include doulinked1.c:#include doulinked1.c:#includ…

Linux下查找\命令(收集整理)

以下为总结&#xff0c;其实可直接跳过&#xff0c;查看locate部分&#xff0c;这个是类似windows下verything搜索工具&#xff01; 一.Linux查找文件的相关命令 常 用 命 令 简要中文说明 程序所在目录 whereis 寻找文件工具 /usr/bin find 寻找文件工具 /usr/bin l…

Linux查找命令 which和find命令

目录 前言一、which命令二、find命令 前言 一、which命令 格式&#xff1a; which [选项] 命令|程序名 #默认当找到第一个目标后不再继续查找选项说明-a查找全部内容&#xff0c;而非第一个文件-n<文件名长度>  指定文件名长度&#xff0c;指定的长度必须大于或等于所有…

Linux文件查找的4个命令

1. find find 命令应该是最经典的命令了&#xff0c;谈到搜索工具第一个想到的肯定是 find 命令。但是&#xff0c;find 命令非常强大&#xff0c;想要把它的功能都介绍一遍&#xff0c;恐怕要写好几篇文章。 所以&#xff0c;这里介绍最基本的&#xff0c;根据文件名查找文件…

Linux下的查找命令合集(which/whereis/locate/find)

Linux 下的查找命令有很多&#xff0c;常用的有which、whereis、locate、find。那么这4个命令之间各自有什么特点&#xff0c;又有什么区别&#xff0c;什么时候该用哪个才最合适呢&#xff1f;方便我们在开发和学习中能更加有效的使用。 1、which 该命令主要是用来查找系统P…

【Linux命令】查找文件命令

文章目录 一、查找文件locateupdatedbfind测试条件操作符操作预定义操作自定义操作 find命令选项&#xff08;常用&#xff09; 一、查找文件 locate locate命令会查找其路径名数据库&#xff0c;输出所有包含查找字符串的匹配项&#xff1a; locate settings.xmlupdatedb …

Linux常用查找命令

1、命令名称&#xff1a;which&#xff08;查看命令文件位置和命令可能出现的别名&#xff09; which 命令 2、whereis&#xff08;查找命令及帮助文档所在位置&#xff09; whereis 命令 3、locate&#xff08;按照文件名查找&#xff0c;按照数据库查找&#xff09; locate…

【Linux学习笔记】8. Linux查找命令:find和grep详解

Linux查找命令 find查找文件grep查找字符串 1. find命令 有多种使用方式&#xff1a; 根据文件名搜索根据文件大小搜索根据文件类型搜索根据修改时间搜索根据文件权限搜索根据文件所有者搜索 上面的各种方式可以利用逻辑与或非组合起来使用。 功能一&#xff1a;按文件名…

linux查找命令,文件就这些which,whereis,locate,find,grep,|

linux生产中我们经常需要查看某个软件是否安装&#xff0c;某个文件在哪里等&#xff0c;某个命令是否存在等。 1. which 查看可执行文件的位置 which命令的作用是&#xff0c;在PATH变量指定的路径中&#xff0c;搜索某个系统命令的位置&#xff0c;并且返回第一个搜索结果…