java对二维数组进行排序

一、按行排序:

对二维数组按进行排序,直接调用Arrays.sort就行:

private static int [][] sortRows(int[][] arr) {//行排序for (int i = 0; i < arr.length; i++) {Arrays.sort(arr[i]);}return arr;}

二、按列排序:

1.使用比较器创建内部类

按第0列,进行升序排序

Arrays.sort(arr, new Comparator<int[]>() {@Overridepublic int compare(int[] o1, int[] o2) {return o1[0] - o2[0];}
});

值得一提的是,这里面用到的方法的compare的原理是这样的:

//compare
public static int compare(int x, int y) {return (x < y) ? -1 : ((x == y) ? 0 : 1);
}

对于输入的x,y:

若x<y,则返回-1(小于0的数);

若x=y,则返回0;

若x>y,则返回1(大于0的数);

在源码中,如果调用compare方法返回值大于0,就把前一个数和后一个数交换,也就是把大的数放后面了,即所谓的 升序了;如果将x,y顺序调换,就是降序了

返回值小于等于0的时候,保持前后顺序不变;

n行2列数组,先按数组的第一列进行升序排序,若某两行第一列相等,则按照第二列进一步排序:

Arrays.sort(arr, new Comparator<int[]>() {    // 匿名内部类@Overridepublic int compare(int[] o1, int[] o2) {// 如果第一列元素相等,则比较第二列元素if (o1[0]==o2[0]) return e1[1]-e2[1];   // o1[1]-o2[1]表示对于第二列元素进行升序排序return o1[0]-o2[0];                     // o1[0]-o2[0]表示对于第一列元素进行升序排序}
});

另外提一点,当需要比较的元素接近那个元素类型的临界值时,使用相减的形式作为compare的返回值容易出现越界异常,因此建议进行if-else大小比较返回值,而不是相减:

Arrays.sort(arr, new Comparator<int[]>() {@Overridepublic int compare(int[] o1, int[] o2) {if(o1[0] > o2[0])return 1;else if(o1[0] == o2[0])return 0;elsereturn -1;}});
2.lambda表达式实现

按第一列元素升序排序:

Arrays.sort(arr, (o1, o2) -> (o1[0] - o2[0]));   // "->"lambda表达式符号,其将参数与实现隔开

如果有数值溢出风险建议采用下面的方法:

Arrays.sort(arr,(int a[],int b[])->Integer.compare(a[0],b[0]));

这样采用的就是比较而不是作差的方式,可以一定程度上规避数值溢出的风险。

3.使用比较器静态方法
Arrays.sort(arr, Comparator.comparingInt(o -> o[0]));

Comparator.comparingInt方法创建一个比较器对象,Comparator.comparingInt方法是Java 8中Comparator接口的一个静态方法,它可以根据指定的键(即排序关键字)对对象进行排序。在这个例子中,我们通过指定o -> o[0]作为键来按照二维数组的第一列进行排序。

使用Comparator.comparingInt方法的好处是它可以更加简洁地定义比较器,同时也可以方便地添加多个排序关键字。比如,如果我们想要按照二维数组的第一列和第二列进行升序排序,可以使用以下代码:

Arrays.sort(arr, Comparator.comparingInt((int[] o) -> o[0]).thenComparingInt(o -> o[1]));

这段代码中,我们首先使用Comparator.comparingInt方法按照第一列进行排序,然后使用thenComparingInt方法按照第二列进行排序。这样就可以按照多个关键字进行排序了。

需要注意的是,使用Comparator.comparingInt方法需要注意排序键的类型。在这个例子中,我们使用了int[]作为排序键的类型,因为我们要按照一维数组的第一个元素进行排序。如果要按照其他类型的字段进行排序,需要相应地修改比较器的实现方式和排序键的类型。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/215893.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机网络:应用层(一)

我最近开了几个专栏&#xff0c;诚信互三&#xff01; > |||《算法专栏》&#xff1a;&#xff1a;刷题教程来自网站《代码随想录》。||| > |||《C专栏》&#xff1a;&#xff1a;记录我学习C的经历&#xff0c;看完你一定会有收获。||| > |||《Linux专栏》&#xff1…

鸿蒙开发之状态管理@Observed和@ObjectLink

一、使用场景 当对象内引用对象&#xff0c;改变内部对象属性的时候其他状态管理如State、Provide、Consume等是无法触发更新的。同样&#xff0c;在数组内如果有对象&#xff0c;改变对象的属性也是无法更新的。在这种情况下就可以采用Observed和ObjectLink装饰器了。 二、使…

C# WPF上位机开发(简易图像处理软件)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 图像处理是工业生产重要的环节。不管是定位、测量、检测还是识别&#xff0c;图像处理在工业生产中扮演重要的角色。而c#由于自身快速开发的特点&a…

玩转 Go 语言并发编程:Goroutine 实战指南

一、goroutine 池 本质上是生产者消费者模型在工作中我们通常会使用可以指定启动的 goroutine 数量-worker pool 模式&#xff0c;控制 goroutine 的数量&#xff0c;防止 goroutine 泄漏和暴涨一个简易的 work pool 示例代码如下&#xff1a; package mainimport ("fmt…

小程序跳转tabbar,tabbar页面不刷新

文章地址&#xff1a;12.小程序 之切换到tabBar页面不刷新问题_360问答 解决办法备份&#xff1a; wx.switchTab&#xff1a;跳转到 tabBar 页面&#xff0c;并关闭其他所有非 tabBar 页面 wx.reLaunch&#xff1a;关闭所有页面&#xff0c;打开到应用内的某个页面。 wx.reLa…

解决微信小程序中 ‘nbsp;‘ 空格不生效的问题

在微信小程序开发中&#xff0c;我们经常会使用 来表示一个空格。这是因为在 HTML 中&#xff0c;空格会被解析为一个普通字符&#xff0c;而不会产生实际的空白间距。而 是一种特殊的字符实体&#xff0c;它被解析为一个不可见的空格&#xff0c;可以在页面上产生真正的空…

力扣70. 爬楼梯

动态规划 思路&#xff1a; 使用递归比较容易理解&#xff0c; f(n) f(n - 1) f(n - 2)&#xff1b; 到剩余1级台阶有 f(n - 1)&#xff0c;到剩余2级台阶有 f(n-2)&#xff1b;边界情况是 n 0, f(0) 1n 1, f(1) 1n 2, f(2) 2 递归代码实现&#xff1a; class Soluti…

Axure RP 9 入门教程

1. Axure简介 Axure 是一个交互式原型设计工具&#xff0c;可以帮助用户创建复杂的交互式应用程序和网站。Axure 能够让用户快速构建出具有高度可交互性的原型&#xff0c;可以在团队中进行协作、分享和测试。 使用 Axure 可以设计出各种不同类型的原型&#xff0c;包括网站、移…

系列十五、搭建redis集群

一、概述 上篇文章介绍了redis集群的相关知识&#xff0c;本章实战演示redis的集群环境的详细搭建步骤。如果帮助到了你&#xff0c;请点赞 收藏 关注&#xff01;有疑问的话也可以评论区交流。 二、搭建步骤 2.1、预备知识 判断一个集群中的节点是否可用&#xff0c;是集群…

【SpringBoot篇】详解基于Redis实现短信登录的操作

文章目录 &#x1f970;前言&#x1f6f8;StringRedisTemplate&#x1f339;使用StringRedisTemplate⭐常用的方法 &#x1f6f8;为什么我们要使用Redis代替Session进行登录操作&#x1f386;具体使用✨编写拦截器✨配置拦截器&#x1f33a;基于Redis实现发送手机验证码操作&am…

EarCMS 前台任意文件上传漏洞复现

0x01 产品简介 EarCMS是一个APP内测分发系统的平台。 0x02 漏洞概述 EarCMS前台put_upload.php中,存在pw参数硬编码问题,同时sql语句pdo使用错误,没有有效过滤sql语句,可以控制文件名和后缀,导致可以任意文件上传。 0x03 复现环境 FOFA:app="EearCMS" 0x0…

Flutter实现自定义二级列表

在Flutter开发中&#xff0c;其实系统已经给我们提供了一个可靠的二级列表展开的API&#xff08;ExpansionPanelList&#xff09;&#xff0c;我们先看系统的二级列表展开效果&#xff0c;一次只能展开一个&#xff0c;用ExpansionPanelList.radio实现 由此可见&#xff0c;已经…

容器化升级对服务有哪些影响?

容器技术是近几年计算机领域的热门技术&#xff0c;特别是随着各种云服务的发展&#xff0c;越来越多的服务运行在以 Docker 为代表的容器之内。 本文我们就来分享一下容器化技术相关的知识。 容器化技术简介 相比传统虚拟化技术&#xff0c;容器技术是一种更加轻量级的操作…

分治法求最大子列和

给定N个整数的序列{ A1, A2, …, AN}&#xff0c;其中可能有正数也可能有负数&#xff0c;找出其中连续的一个子数列&#xff08;不允许空序列&#xff09;&#xff0c;使它们的和尽可能大&#xff0c;如果是负数&#xff0c;则返回0。使用下列函数&#xff0c;完成分治法求最大…

CorelDRAW软件2024版本好用吗?有哪些功能优势

CorelDRAW是一款综合性强大的专业平面设计软件&#xff0c;其功能覆盖了矢量图形设计、高级文字编辑、精细绘图以及多页文档和页面设计。该软件不仅适用于广告设计、包装设计&#xff0c;还广泛应用于出版、网页设计和多媒体制作等多个领域。下面就给大家介绍一下CorelDRAW这款…

0012Java安卓程序设计-ssm记账app

文章目录 **摘要**目 录系统设计5.1 APP端&#xff08;用户功能&#xff09;5.2后端管理员功能模块开发环境 编程技术交流、源码分享、模板分享、网课分享 企鹅&#x1f427;裙&#xff1a;776871563 摘要 网络的广泛应用给生活带来了十分的便利。所以把记账管理与现在网络相…

arkts编译报错-arkts-limited-stdlib错误【Bug已完美解决-鸿蒙开发】

文章目录 项目场景:问题描述原因分析:解决方案:适配指导案例此Bug解决方案总结项目场景: arkts编译报错-arkts-limited-stdlib错误。 我用Deveco studio4.0 beta2开发应用,报arkts-limited-stdlib错误 报错内容为: ERROR: ArKTS:ERROR File: D:/prRevivw/3792lapplica…

[Verilog]用Verilog实现串并转换/并串装换

用Verilog实现串并转换/并串装换 摘要 一、串并转换模块 串转并就是将低3位信号和输入信号一起赋值。因为经过转换后&#xff0c;码元速率会将为原来四分之一&#xff0c;所以设置4分频时钟&#xff0c;将其输出。而并转串就是不断右移&#xff0c;取高位输出。 module serial…

Android 11.0 systemui锁屏页面时钟显示样式的定制功能实现

1.前言 在11.0的系统ROM定制化开发中,在进行systemui的相关开发中,当开机完成后在锁屏页面就会显示时间日期的功能,由于 开发产品的需求要求时间显示周几上午下午接下来就需要对锁屏显示时间日期的相关布局进行分析,然后实现相关功能 效果图如图: 2.systemui锁屏页面时钟显…

mysql原理--B+树索引

1.没有索引的查找 1.1.在一个页中的查找 (1). 以主键为搜索条件 可以在 页目录 中使用二分法快速定位到对应的槽&#xff0c;然后再遍历该槽对应分组中的记录即可快速找到指定的记录。 (2). 以其他列作为搜索条件 这种情况下只能从 最小记录 开始依次遍历单链表中的每条记录&am…