Java实例讲解Comparator的使用
作者:宏远十一冠王 发布时间:2021-07-15 09:16:58
前言
今天刷个题,遇到一个很有趣的问题,关于Comparator的使用,感觉也是一个关于写代码的一些小细节的问题
关于Comparator
Comparator是java8新增的一个比较器,相信大家如果使用过Arrays和Collections的排序方法时,应该对这个都不陌生,不知道大家都是怎么写比较器内部的代码
这种写法应该也是大家会用的方法。
// 1. 第一种写法
Arrays.sort(points, new Comparator<int[]>() {
public int compare(int[] o1, int[] o2) {
if (o1[0] != o2[0]) {
return o1[0] - o2[0];
} else {
return o1[1] - o2[1];
}
}
});
第二种写法,这种是调用compareTo方法,这种方法是用来比较Integer, Long, Short, Double,Byte类型
```java
// 1. 第一种写法
Arrays.sort(points, new Comparator<Integer>() {
public int compare(Integer o1, Integer o2) {
return o1.compareTo(o2);
}
});
第三种写法,这种写法应该是非常常见的写法了。
```java
Arrays.sort(points, new Comparator<int[]>() {
public int compare(int[] o1, int[] o2) {
if (o1[0] < o2[0]) {
return -1;
} else if (o1[0] > o2[0]) {
return 1;
} else {
return 0;
}
}
});
原题
细心的同学就会发现了,第一种写法是有一定问题的,第二种方法的话有一定的局限性,为什么我会这么说呢,先看一道题吧LeetCode452:用最小数量的箭引爆气球这道题。
有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组 points ,
其中points[i] = [xstart, xend] 表示水平直径在 xstart 和 xend之间的气球。你不知
道气球的确切 y 坐标。一支弓箭可以沿着 x 轴从不同点 完全垂直 地射出。在坐标 x 处射出
一支箭,若有一个气球的直径的开始和结束坐标为 xstart,xend, 且满足
xstart ≤ x ≤ xend,则该气球会被 引爆 。可以射出的弓箭的数量 没有限制 。
弓箭一旦被射出之后,可以无限地前进。给你一个数组 points ,返回引爆所有气球所必须
射出的 最小 弓箭数 。
这道题的思路也不是很难,我们可以先对气球的start进行一个排序,然后关于气球的重叠我们可以分为两种情况,主要分为不重叠的情况和重叠的情况,重叠的情况以两个重叠的右边界的最小值来充当边界,然后遍历就可以成功。
下面来看我第一次提交的代码
class Solution {
public int findMinArrowShots(int[][] points) {
int n = points.length;
if (n == 0) {
return 0;
}
Arrays.sort(points, new Comparator<int[]>() {
public int compare(int[] o1, int[] o2) {
if (o1[0] != o2[0]) {
return o1[0] - o2[0];
} else {
return o1[1] - o2[1];
}
}
});
int ans = 1;
// 如果两个气球都有重叠,取两个重叠的最小值,如果两个没有重叠,直接加1
for (int i = 1; i < n; i++) {
if (points[i][0] > points[i-1][1]) {
ans ++;
} else {
// have overlap min right side
points[i][1] = Math.min(points[i][1], points[i-1][1]);
}
}
return ans;
}
}
好像这样看来是没有什么问题的,但是提交呢,竟然不通过,然后看一下最后执行的输入
[[-2147483646,-2147483645],[2147483646,2147483647]]
我们定位一下错误,o1[0] - o2[0]这里是不是已经越界了呢,事实是确实已经越界了,具体的结果留给大家去试了。
我们采用第三种比较方法提交
class Solution {
public int findMinArrowShots(int[][] points) {
int n = points.length;
if (n == 0) {
return 0;
}
Arrays.sort(points, new Comparator<int[]>() {
public int compare(int[] o1, int[] o2) {
if (o1[0] < o2[0]) {
return -1;
} else if (o1[0] > o2[0]) {
return 1;
} else {
return 0;
}
}
});
int ans = 1;
// 如果两个气球都有重叠,取两个重叠的最小值,如果两个没有重叠,直接加1
for (int i = 1; i < n; i++) {
if (points[i][0] > points[i-1][1]) {
ans++;
} else {
// have overlap min right side
points[i][1] = Math.min(points[i][1], points[i-1][1]);
}
}
return ans;
}
}
当然最后是A了,不过这个越界还卡了我好久,没有注意到越界问题…
来源:https://blog.csdn.net/zly03/article/details/127459214


猜你喜欢
- MyBatis 的一个强大的特性之一通常是它的动态 SQL 能力。如果你有使用 JDBC 或其他 相似框架的经验,你就明白条件地串联 SQL
- 1. 简介zookeeper是一个开源的分布式协调服务, 提供分布式数据一致性解决方案,分布式应用程序可以实现数据统一配置管理、统一命名服务
- Android文件存储看下网上随处可以搜到的文件存储套路if(Environment.MEDIA_MOUNTED.equals(Enviro
- 一、字符串:1、访问String中的字符:string本身可看作一个Char数组。string s = "hello world&
- 一、延迟加载:LazyLoading使用延迟加载,关联的实体必须标注为virtual。本例是标注Destination类里的Lodgings
- 前言在使用Webview进行滑动操作时,从屏幕可见区域外向内滑动时,会出现webview区域闪烁的问题(反之也是),本文将提供一种解决方案。
- 左值右值定义:左值指的是既能够出现在等号左边也能出现在等号右边的变量(或表达式),右值指的则是只能出现在等号右边的变量(或表达式).int
- 本文实例讲述了Android程序启动时出现黑屏问题的解决方法。分享给大家供大家参考,具体如下:关于黑屏:默认的情况下,程序启动时,会有一个黑
- 本文通过C#程序代码展示如何给PDF文档添加可视化数字签名和不可见数字签名。可视化数字签名,即在PDF文档中的指定页面位置添加签名,包含相关
- IEnumerable、ICollection、IList、List之间的区别,本文分别分析了它的实现源码,从而总结出了它们之间的关系和不同
- 下面一段代码给大家介绍了android 自定义顶部导航栏控件功能,具体代码如下所示:class HeaderBar @JvmOverload
- 1.前置准备默认服务器上的hadoop服务已经启动本地如果是windows环境,需要本地配置下hadoop的环境变量本地配置hadoop的环
- 1.使用的是maven项目,添加依赖<!-- mybatis-plus begin --> <depend
- 一.Mybatis-Plus——sum聚合函数//总收益 Order order =new Orde
- 一、加密方案介绍对接口的加密解密操作主要有下面两种方式:自定义消息转换器优势:仅需实现接口,配置简单。劣势:仅能对同一类型的MediaTyp
- 不过我写的比较草率,代码结构不是很好,也没有体现OOP的思想,这几天有空会重构一下。先把代码发出来:public class MatrixC
- 1.文件页面编码导致的乱码。每一个文件(java,js,jsp,html等)都有其本身的编码格式,文件中的代码在一种编码中显示正常,在另外一
- 序章首先引入依赖 implementation 'com.squareup.retrofit2:retro
- 前言Zookeeper的通过快照日志和事务日志将内存信息保存下来,记录下来每次请求的具体信息。尤其是其事务日志,每次处理事务请求时都需要将其
- 本文实例为大家分享了java实现三角形分形山脉的具体代码,供大家参考,具体内容如下三角形分形山脉原理原型图如图,这是三角形分形山脉的一个原型