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

对二维数组从两个维度进行排序(Arrays.sort()方法使用Lambada表达式)

平时经常遇到的是对一维数组进行排序,直接调用Arrays.sort()方法,传入数组就可以实现。那么如何对二维数组进行排序呢?
这里对二维数组进行排序的意思是什么呢?
比如这样一个例子:
一个二维数组 int[][] arr ,第一维表示身高,第二维表示体重。现要求对这个二维数组进行排序。排序要求是优先按照身高从大到小排,当身高相同时,按照体重从小到大排。

实现:通过Arrays.sort()方法,传入参数,利用Lambada表达式进行判断。

测试代码如下:

public static void main(String[] args) {
        // 定义数组
        int[][] arr = new int[][]{{7,0}, {4,4}, {7,1}, {5,0}, {6,1}, {5,2}};
        // 利用Lambda表达式对数组排序
        Arrays.sort(arr, (o1, o2) -> {
            if (o1[0] == o2[0]) {	//第一维的身高相同时
                return Integer.compare(o1[1], o2[1]);   // 从小到大
            }
           return Integer.compare(o2[0], o1[0]);   // 从大到小
        });
        // 打印输出
        for (int[] i :arr) {
            String s = Arrays.toString(i);
            System.out.println(s);

        }
    }

上面的测试代码中使用了 Integer.compare()对两个数大小进行判断。如果用

return o1[1] - o2[1];

做减法也是可以的,但是在数据比较大的情况下(大于2147483647),会造成整型溢出而报错。所以推荐使用 Integer.compare()判断。

输出结果:

[7, 0]
[7, 1]
[6, 1]
[5, 0]
[5, 2]
[4, 4]

可以看到,数组是先按照第二个维度排序的,当第二个维度的元素相等时,则按照第一个维度的元素进行排序。


什么是Lamdaba表达式?
可以将Lambda表达式理解为一个匿名函数; Lambda表达式允许将一个函数作为另外一个函数的参数; 我们可以把 Lambda 表达式理解为是一段可以传递的代码(将代码作为实参),也可以理解为函数式编程,将一个函数作为参数进行传递。

​它支持将代码块作为方法参数、允许使用更简洁的代码来创建只有一个抽象方法的接口的实例。

​Lambda 表达式的主要作用就是可以用于简化创建匿名内部类对象,Lambda 表达式的代码块将会用于实现抽象方法的方法体,Lambda 表达式就相当于一个匿名方法。
Lambda表达式的语法:

([Lambda参数列表,即形参列表]) -> {Lambda体,即方法体}
  • 形参列表:形参列表允许省略类型,如果形参列表中只有一个参数,形参列表的圆括号也可以省略;
  • 箭头(->):通过英文画线和大于符号组成;
  • 代码块:如果代码块只有一条语句,花括号可以省略。Lambda 代码块只有一条 return 语句,可以省略 return 关键字,Lambda 表达式会自动返回这条语句的值作为返回值。

拷贝小括号,写死右箭头,落地大括号,大括号中写上业务逻辑

特点:使用 "->"将参数和实现逻辑分离;( ) 中的部分是需要传入Lambda体中的参数;{ } 中部分,接收来自 ( ) 中的参数,完成一定的功能。

相关文章:

  • SpringBoot 接口整理
  • SpringBoot工程打包与发布运行
  • 芒格-“永远不要有受害者心态”
  • 【位运算】leetcode 190. 颠倒二进制位
  • nexus on k8s最佳实战
  • LeetCode 每日一题 2022/8/29-2022/9/4
  • webpack定制化 高级配置[热更新、热打包、别名、调试]
  • 外贸员需要知道的那些事儿
  • c++11 多线程支持 (std::shared_future)
  • webpack定制化 基础配置[基础、配置、初运行]
  • mysql基本语句:DQL(数据查询语言)
  • Android | 通过URL获取网络图片Bitmap格式
  • SpringCloud-01 Rest学习环境搭建笔记
  • 基于APB与I2C的多主多从架构设计 - Function Description
  • R语言 ggdendro_谱系图
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • Docker 笔记(2):Dockerfile
  • ERLANG 网工修炼笔记 ---- UDP
  • JS+CSS实现数字滚动
  • vue中实现单选
  • 关于使用markdown的方法(引自CSDN教程)
  • 近期前端发展计划
  • 面试遇到的一些题
  • 使用 Xcode 的 Target 区分开发和生产环境
  • 微服务框架lagom
  • 新书推荐|Windows黑客编程技术详解
  • 好程序员大数据教程Hadoop全分布安装(非HA)
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • # Maven错误Error executing Maven
  • #中国IT界的第一本漂流日记 传递IT正能量# 【分享得“IT漂友”勋章】
  • $$$$GB2312-80区位编码表$$$$
  • (2)STL算法之元素计数
  • (DFS + 剪枝)【洛谷P1731】 [NOI1999] 生日蛋糕
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理 第13章 项目资源管理(七)
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424
  • (一)WLAN定义和基本架构转
  • (转) RFS+AutoItLibrary测试web对话框
  • (转)Sql Server 保留几位小数的两种做法
  • (转)母版页和相对路径
  • .bat文件调用java类的main方法
  • .NET 分布式技术比较
  • .net 获取url的方法
  • .net 受管制代码
  • .NET实现之(自动更新)
  • .set 数据导入matlab,设置变量导入选项 - MATLAB setvaropts - MathWorks 中国
  • @Autowired @Resource @Qualifier的区别
  • @Autowired注解的实现原理
  • [ 云计算 | AWS 实践 ] Java 如何重命名 Amazon S3 中的文件和文件夹
  • [20161214]如何确定dbid.txt
  • [Asp.net MVC]Bundle合并,压缩js、css文件
  • [AutoSAR 存储] 汽车智能座舱的存储需求
  • [BT]BUUCTF刷题第4天(3.22)
  • [bzoj 3534][Sdoi2014] 重建