当前位置: 首页 > news >正文

JAVA的sort用法详解(二维数组排序,List<>排序,lambada表达式,自定义类型排序)

目录

前言:

一维数组降序:

方法1.Comparator接口:

代码实现:

方法2.Collections.reverseOrder():

代码实现: 

二维数组排序:

代码如下:

List<>排序:

代码如下:

自定义类型比较排序:

按照年龄逆序排序:

按照姓名升序排序:

lambada表达式简写:

一维数组逆序代码:

二维数组排序代码:

List<>排序代码:

自定义类型排序:

结语:


前言:

由于最近刷一些比赛真题时,发现有一些题要先排序一下后面才能用贪心之类的算法解决,在比赛上面自己实现一个排序算法有点浪费时间(当然不是指冒泡插入之类的简单排序,太慢了😭),考虑到java中Arrays类中有sort方法我们可以引用sort来排序,升序简单那降序呢,一维数组会排序那二维数组和List<>呢? 本文章就是为了解决这些问题,希望对友友有所帮助。💕💕💕

我相信来看这个的一般都是有急用吧😭😭😭(作者曾经也是),如果很急的话直接看代码实现,直接模仿着写即可,其他的都是一些知识点的讲解。

要想使用sort排序,排序的对象必须实现comparable接口才行,由于Comparable不太灵活故本文章不做详细介绍。

一位数组的基本类型sort方法都能排序(升序)。

可以说的是一维数组降序和二维数组排序都是通过如下sort的重载方法即传入一个比较器(参数是泛型的不能是基本类型)。

一维数组降序:

声明:为了方便叙述下面采用int和Integer进行叙述其他类似。

经过多次尝试和查阅许多资料得出:要想把一维数组逆序如果是基本类型的话要把它变成包装类,

基本类型实现不了。

方法1.Comparator接口:

实现Comparator接口可以说是最常用的一种自定义排序操作了,它比Comparable更加灵活,想要根据什么比较直接自己实现就行,下面我们就开始对它的介绍💕:

Comparator是一个接口,既然接口那么我们实现它必须要重写它的抽象方法compare必须要重写这一个(这个接口只有这一个方法)

如果不实现就是出现如下错误。 

 

实现比较器Comparator接口,上面< T >代表这是一个泛型(如果对泛型还不是很了解的话也没关系我们可以先会用就行),注意:泛型只能接受类,所有的基本数据类型必须使用包装类!,这就代表了我们要实现一维数组的逆序必须要把基本类型换成其包装类才行。否则会报如下错误。

代码实现:

import java.util.Arrays;
import java.util.Comparator;
class cmp implements Comparator<Integer>{@Overridepublic int compare(Integer o1,Integer o2){return o2 - o1;}
}
public class Test1 {public static void main(String[] args) {Integer[] nums = {1,2,3,4,5};Arrays.sort(nums,new cmp());for(int i = 0;i < nums.length;i++){System.out.print(nums[i] + " ");}}
}

效果如下:

如果想要升序的话就o1 - o2.  

方法2.Collections.reverseOrder():

 这个我是从别人那里看到的,因为这个好像整洁一点故也把他写进来(还是推荐Comparator

),源码如下,我们可以看到其实是传入一个比较器(Comparator)。注意要importCollections这个类。其源代码如下图。

代码实现: 

import java.util.Arrays;
import java.util.Collections;
public class Main{public static void main(String[] args) {Integer[] nums = {1,2,3,4,5};Arrays.sort(nums, Collections.reverseOrder());for(int i = 0;i < nums.length;i++){System.out.print(nums[i] + " ");}}
}

 不过很可惜的是这样像int这样的基本类型还是不行🈚。

二维数组排序:

二维数组这里只介绍Comparator方法,这个是最常用的并且作者只会这个😭,如果有大佬补充的话非常感谢🙇‍

代码如下:

是不是非常神奇,这其实说明int[]在内部可能是把它当作类来看的。

import java.util.Arrays;
import java.util.Comparator;
class cmp implements Comparator<int[]> {@Overridepublic int compare(int[] o1,int[] o2){return o1[0] - o2[0];}
}
public class Main {public static void main(String[] args) {int[][] nums = {{1,7},{2,6},{3,9},{8,2},{2,5}};Arrays.sort(nums,new cmp());for(int i = 0;i < nums.length;i++){for(int j = 0;j < nums[i].length;j++) {System.out.print(nums[i][j] + " ");}System.out.println();}}
}

结果如下我们是按照一行的第一个元素进行排序,显然这样做我们的结果是对的😎😎😎 

相信到这里友友们是不是发现新大陆了呢,按照每行的第几个数组来排序就改对应的o1和o2的下标即可如果想要逆序的话只需把o1 - o2 改为 o2 - o1即可。

多维类似,因为用的比较少故这里不再展开☆*: .。. o(≧▽≦)o .。.:*☆。

List<>排序:

在刷力扣的友友应该有这方面的需求,这类题目一般都是深搜DFS和回溯,要你返回这样的类型或者题目给你这样的类型。不先排个序的话会非常麻烦😫😫😫。这个List排序和上面的数组排序类似,这里写下是因为可能有的友友不知道List类中本来就有个sort方法可以用来排序List<>.

下面图片来自List官方文档,要想排序List<>就要调用List类中的sort方法,万幸的是它也可以传入比较器这意味这通用性会更强。

要想实现List.sort()排序就要创建一个比较类cmp(名字随便),cmp实现Comparator接口,在接口中传入List<>中的数据类型,注意不是传入List<Integer>可能有的友友会这么认为,但这是错误的❌。

代码如下:

import java.util.Comparator;
import java.util.List;
import java.util.ArrayList;
class cmp implements Comparator<Integer>{@Overridepublic int compare(Integer o1, Integer o2) {return o1 - o2;}
}
public class Test1 {public static void main(String[] args) {List<Integer> ret = new ArrayList<>();ret.add(4);ret.add(3);ret.add(2);ret.add(1);ret.sort(new cmp());for(Integer x:ret){System.out.print(x + " ");}}
}

其运行结果如下:显然正确😎😎😎

自定义类型比较排序:

声明:为了方便叙述我们自定义一个Person类里面有int类型的年龄,String类型的姓名。

在更多情况下我们还是想直接用sort来排序自定义类型,下面我给出java对象比较的三种方式如下图:

覆写的方法说明
Object.equals因为所有类都是继承自Object的,所以直接覆写即可,不过只能比较相等与否。
Comparable.compareTo需要手动实现接口,侵入性比较强,但一旦实现,每次用该类都有顺序,属于内部顺序。
Comparator.compare需要实现一个比较器对象,对待比较类的侵入性弱,但对算法代码实现侵入性强。

equals不是用在sort中的,只是如果想要就自定义类型使用>,<,==,的话就必须要重写equals方法。

在自定义类中基本用的都是自己实现一个比较器故下面不讲Comparable(只能比较一个,后续如果要修改很麻烦不方便),都是使用Comparator。

由于本文章主要讲解自定义类型sort排序,其它的一些细节问题不过多描述还请见谅❤️。

如果直接用sort的话编译能通过但会报如下错误,右边为Person类。

按照年龄逆序排序:

代码如下:

import java.util.Arrays;
import java.util.Comparator;class Person{int age;String name;public Person(int age,String name){this.age = age;this.name = name;}@Overridepublic String toString() {return "Person{" +"age=" + age +", name='" + name + '\'' +'}';}
}
class cmp implements Comparator<Person>{public int compare(Person o1,Person o2){return o2.age - o1.age;}
}
public class Test2 {public static void main(String[] args) {Person person1 = new Person(1,"cc");Person person2 = new Person(3,"bb");Person person3 = new Person(2,"aa");Person[] array = new Person[3];array[0] = person1;array[1] = person2;array[2] = person3;Arrays.sort(array,new cmp());for(int i = 0;i < array.length;i++){System.out.println(array[i]);}}
}

效果如下:

之所以能println出来这样是因为我们在Person类中重写了toString方法。

升序就不用说了。

按照姓名升序排序:

为了使文章更加简洁下面只给出比较器,友友们自己替换一下即可。name是String类型要比较大小直接调用compareTo方法即可。

class cmp implements Comparator<Person>{public int compare(Person o1,Person o2){return o1.name.compareTo(o2.name);}
}

结果如下:

lambada表达式简写:

这个lambada表达式简写是我在看别人题解时看到的,说实话第一次看到有点震惊,如果对这个很熟悉的话用sort来实现各种排序将写的非常快。由于文章篇幅有限下面直接给出用法不解释原理,大家可以先模仿等后续学到lambada表达式就水到渠成了👍👍👍

下面是lambada的语法实在不想看的话可以跳过会用就行👌

Lambada表达式的语法:

基本语法: (parameters) -> expression 或 (parameters) ->{ statements}

Lambda表达式由三部分组成:

(1)paramaters:类似方法中的形参列表,这里的参数是函数式接口里的参数。这里的参数类型可以明确的声明也可不声明而由JVM隐含的推断。另外当只有一个推断类型时可以省略掉圆括号。

(2)->:可理解为“被用于”的意思。

(3)方法体:可以是表达式也可以是代码块,是函数式接口里方法的实现。代码块可返回一个值或者什么都不返回,这里的代码块等同于方法的方法体。如果是表达式,也可以返回一个值或者什么都不反回。

一维数组逆序代码:

public class Test4 {public static void main(String[] args) {Integer[] nums = {1,7,4,2,9,6,4};Arrays.sort(nums,(o1,o2)-> o2 - o1);for(int i = 0;i < nums.length;i++){System.out.print(nums[i] + " ");}}
}

结果如下:

二维数组排序代码:

import java.util.Arrays;
public class Test5 {public static void main(String[] args) {int[][] nums = {{1,3},{2,7},{6,7},{4,1},{3,9}};Arrays.sort(nums,(o1,o2)->o1[0] - o2[0]);for(int i = 0;i < nums.length;i++){for(int j = 0;j < nums[i].length;j++){System.out.print(nums[i][j] + " ");}System.out.println();}}
}

效果如下:

List<>排序代码:

import java.util.ArrayList;
import java.util.List;
public class Test6 {public static void main(String[] args) {List<Integer> ret = new ArrayList<>();ret.add(1);ret.add(2);ret.add(3);ret.add(4);ret.sort((o1,o2)->o2 - o1);for(Integer x:ret){System.out.print(x + " ");}}
}

 结果如下:

自定义类型排序:

这个有点多且上面代码给过了这里直接给图片啦!

到这已经把Java当中sort常用的排序已经全部给出,说实话整理出来还是挺不容易的😫😫😫,查阅资料等等这篇博客我整理了将近一周的时间希望对大家有所帮助❤️❤️❤️。

结语:

其实写博客不仅仅是为了教大家,同时这也有利于我巩固知识点,和做一个学习的总结,由于作者水平有限,对文章有任何问题还请指出,非常感谢。如果大家有所收获的话还请不要吝啬你们的点赞收藏和关注,这可以激励我写出更加优秀的文章。

相关文章:

JAVA的sort用法详解(二维数组排序,List<>排序,lambada表达式,自定义类型排序)

目录 前言&#xff1a; 一维数组降序&#xff1a; 方法1.Comparator接口&#xff1a; 代码实现&#xff1a; 方法2.Collections.reverseOrder()&#xff1a; 代码实现&#xff1a; 二维数组排序&#xff1a; 代码如下&#xff1a; List<>排序&#xff1a; 代码…...

数据分析能力模型分析与展示

具体内容&#xff1a; 专业素质 专业素质-01 数据处理 能力定义•能通过各种数据处理工具及数据处理方法&#xff0c;对内外部海量数据进行清洗和运用&#xff0c;提供统一数据标准&#xff0c;为业务分析做好数据支持工作。 L1•掌握一…...

BUG未解之谜01-指针引用之谜

在leetcode里面刷题出现的问题&#xff0c;当我在sortedArrayToBST里面给root赋予初始值NULL之后&#xff0c;问题得到解决&#xff01; 理论上root是未初始化的变量&#xff0c;然后我进入insert函数之后&#xff0c;root引用的内容也是未知值&#xff0c;因此无法给原来的二叉…...

数据库事务编程

事务是一个不可分割的数据库操作序列&#xff0c;也是数据库并发控制的基本单位&#xff0c;其执行的结果必须使数据库从一种一致性状态到另一种一致性状态。事务是逻辑上的一组操作&#xff0c;要么都执行&#xff0c;要么都不执行。 事务的 4 大特性 ACID 原子性 Atomicit…...

专题二_滑动窗口(1)

目录 209. 长度最小的子数组 解析 题解 3. 无重复字符的最长子串 解析 题解 1004. 最大连续1的个数 III 解析 题解 209. 长度最小的子数组 209. 长度最小的子数组 - 力扣&#xff08;LeetCode&#xff09; 解析 题解 class Solution { public:int minSubArrayLen(int…...

把本地文件上传到HDFS上操作步骤

因为条件有限&#xff0c;我这里以虚拟机centos为例 实验条件&#xff1a;我在虚拟机上创建了三台节点&#xff0c;部署了hadoop&#xff0c;把笔记本上的数据上传到hdfs中 数据打包上传到虚拟机节点上 采用的是rz命令&#xff0c;可以帮我们上传数据 没有的话可以使用命令安装…...

Leo赠书活动-21期 《一篇讲明白 Hadoop 生态的三大部件》

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; 赠书活动专栏 ✨特色专栏&#xff1a;…...

【Redis】Redis 介绍Redis 为什么这么快?Redis数据结构Redis 和Memcache区别 ?为何Redis单线程效率也高?

目录 Redis 介绍 Redis 为什么这么快&#xff1f; Redis数据结构 Redis 和Memcache区别 &#xff1f; 为何Redis单线程效率也高&#xff1f; Redis 介绍 Redis 是一个开源&#xff08;BSD 许可&#xff09;、基于内存、支持多种数据结构的存储系统&#xff0c;可以作为数据…...

ArrayList和LinkedList有什么区别?

ArrayList和LinkedList的区别 ArrayList 和 LinkedList 是 Java 中常用的两种集合类&#xff0c;它们都实现了 List 接口&#xff0c;但在内部实现和性能上有一些区别。 内部实现&#xff1a; ArrayList 使用数组实现&#xff0c;它的元素在内存中是连续存储的&#xff0c;每…...

离线数仓(八)【DWD 层开发】

前言 1、DWD 层开发 DWD层设计要点&#xff1a; &#xff08;1&#xff09;DWD层的设计依据是维度建模理论&#xff08;主体是事务型事实表&#xff08;选择业务过程 -> 声明粒度 -> 确定维度 -> 确定事实&#xff09;&#xff0c;另外两种周期型快照事实表和累积型…...

Jenkins用户角色权限管理

Jenkins作为一款强大的自动化构建与持续集成工具&#xff0c;用户角色权限管理是其功能体系中不可或缺的一环。有效的权限管理能确保项目的安全稳定&#xff0c;避免敏感信息泄露。 1、安装插件&#xff1a;Role-based Authorization Strategy 系统管理 > 插件管理 > 可…...

简明conan教程

简明conan教程 1 关于conan1.1 来源1.2 作用 2 安装conan2.1 ubuntu2.1.1 安装python32.1.2 安装conan 2.2 Windows2.2.1 安装python32.2.2 安装conan 2.3 验证conan是否成功2.4 命令解释2.4.1 Consumer commands2.4.2 Creator commands2.4.3 Package development commands2.4.…...

LeetCode刷题--- 等差数列划分 II - 子序列

个人主页&#xff1a;元清加油_【C】,【C语言】,【数据结构与算法】-CSDN博客 个人专栏 力扣递归题 http://t.csdnimg.cn/yUl2I 【C】 ​​​​​​http://t.csdnimg.cn/6AbpV 数据结构 ​​​http://t.csdnimg.cn/hKh2l 前言&#xff1a;这个专栏主要讲述动态规划算…...

kubectl 启用shell自动补全功能

官网手册参考&#xff1a;https://kubernetes.io/zh-cn/docs/tasks/tools/install-kubectl-linux/ 系统&#xff1a;centos7 补全脚本依赖于工具 bash-completion&#xff0c; 所以要先安装它&#xff08;可以用命令 type _init_completion 检查 bash-completion 是否已安装&a…...

极简wordpress网站模板

Pithy设计师wordpress网站模板 精练简洁的wordpress模板&#xff0c;设计师或设计工作室展示型网站模板。 https://www.jianzhanpress.com/?p6329...

【python】(16)python的字典dict按照key或value排序的不同方法

系列文章回顾 【python】(01)初识装饰器Decorator 【python】(02)初识迭代器Iterator 【python】(03)初识生成器Generator 【python】(04)python中实现多任务并发和并行的区别 【python】(05)如何使用python中的logging模块记录日志信息 【python】(06)理解Python中的 lambda 、…...

微服务篇-C 深入理解第一代微服务(SpringCloud)_VI 深入理解Zuul服务网关

原创作者&#xff1a;田超凡&#xff08;程序员田宝宝&#xff09; 版权所有&#xff0c;引用请注明原作者&#xff0c;严禁复制转载 Part 1 理论部分 1 网关类别有哪些&#xff1f; 常见的网关类别有三种&#xff1a;开放API&#xff08;Open API&#xff09;网关、微服务…...

web CSS笔记1

CSS(Cascading Style Sheets) 美化样式 CSS通常称为CSS样式表或层叠样式表&#xff08;级联样式表&#xff09;&#xff0c;主要用于设置HTML页面中的文本内容&#xff08;字体、大小、对齐方式等&#xff09;、图片的外形&#xff08;宽高、边框样式、边距等&#xff09;以及…...

js算法记录

> 更多请前往 https://www.passerma.com/article/86 滑动窗口 1 给定一个矩阵&#xff0c;包含N*M个整数&#xff0c;和一个包含K个整数的数组。现在要求在这个矩阵中找一个宽度最小的子矩阵&#xff0c;要求子矩阵包含数组中所有的整数 function minSubmatrixWidth(mat…...

球面数据的几何深度学习--球形 CNN

目录 一、说明二、球形 CNN概述三、球面数据的对称性四、标准&#xff08;平面&#xff09;CNN的局限性五、卷积并发症六、球面卷积七、球面卷积是不够的 一、说明 球面数据的几何深度学习–球形 CNN。通过对物理世界的平移对称性进行编码&#xff0c;卷积神经网络 &#xff0…...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用&#xff0c;操作系统&#xff1a;Ubuntu24.04&#xff0c;Neofj版本&#xff1a;2025.04.0。 Apt安装 Neofj可以进行官网安装&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

golang循环变量捕获问题​​

在 Go 语言中&#xff0c;当在循环中启动协程&#xff08;goroutine&#xff09;时&#xff0c;如果在协程闭包中直接引用循环变量&#xff0c;可能会遇到一个常见的陷阱 - ​​循环变量捕获问题​​。让我详细解释一下&#xff1a; 问题背景 看这个代码片段&#xff1a; fo…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

【位运算】消失的两个数字(hard)

消失的两个数字&#xff08;hard&#xff09; 题⽬描述&#xff1a;解法&#xff08;位运算&#xff09;&#xff1a;Java 算法代码&#xff1a;更简便代码 题⽬链接&#xff1a;⾯试题 17.19. 消失的两个数字 题⽬描述&#xff1a; 给定⼀个数组&#xff0c;包含从 1 到 N 所有…...

电脑插入多块移动硬盘后经常出现卡顿和蓝屏

当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时&#xff0c;可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案&#xff1a; 1. 检查电源供电问题 问题原因&#xff1a;多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

linux 下常用变更-8

1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行&#xff0c;YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID&#xff1a; YW3…...

根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:

根据万维钢精英日课6的内容&#xff0c;使用AI&#xff08;2025&#xff09;可以参考以下方法&#xff1a; 四个洞见 模型已经比人聪明&#xff1a;以ChatGPT o3为代表的AI非常强大&#xff0c;能运用高级理论解释道理、引用最新学术论文&#xff0c;生成对顶尖科学家都有用的…...

React---day11

14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store&#xff1a; 我们在使用异步的时候理应是要使用中间件的&#xff0c;但是configureStore 已经自动集成了 redux-thunk&#xff0c;注意action里面要返回函数 import { configureS…...

关于easyexcel动态下拉选问题处理

前些日子突然碰到一个问题&#xff0c;说是客户的导入文件模版想支持部分导入内容的下拉选&#xff0c;于是我就找了easyexcel官网寻找解决方案&#xff0c;并没有找到合适的方案&#xff0c;没办法只能自己动手并分享出来&#xff0c;针对Java生成Excel下拉菜单时因选项过多导…...

阿里云Ubuntu 22.04 64位搭建Flask流程(亲测)

cd /home 进入home盘 安装虚拟环境&#xff1a; 1、安装virtualenv pip install virtualenv 2.创建新的虚拟环境&#xff1a; virtualenv myenv 3、激活虚拟环境&#xff08;激活环境可以在当前环境下安装包&#xff09; source myenv/bin/activate 此时&#xff0c;终端…...