Java實(shí)例講解Comparator的使用
前言
今天刷個(gè)題,遇到一個(gè)很有趣的問(wèn)題,關(guān)于Comparator的使用,感覺(jué)也是一個(gè)關(guān)于寫(xiě)代碼的一些小細(xì)節(jié)的問(wèn)題
關(guān)于Comparator
Comparator是java8新增的一個(gè)比較器,相信大家如果使用過(guò)Arrays和Collections的排序方法時(shí),應(yīng)該對(duì)這個(gè)都不陌生,不知道大家都是怎么寫(xiě)比較器內(nèi)部的代碼
這種寫(xiě)法應(yīng)該也是大家會(huì)用的方法。
// 1. 第一種寫(xiě)法
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];
}
}
});第二種寫(xiě)法,這種是調(diào)用compareTo方法,這種方法是用來(lái)比較Integer, Long, Short, Double,Byte類(lèi)型
```java
// 1. 第一種寫(xiě)法
Arrays.sort(points, new Comparator<Integer>() {
public int compare(Integer o1, Integer o2) {
return o1.compareTo(o2);
}
});第三種寫(xiě)法,這種寫(xiě)法應(yīng)該是非常常見(jiàn)的寫(xiě)法了。
```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;
}
}
});原題
細(xì)心的同學(xué)就會(huì)發(fā)現(xiàn)了,第一種寫(xiě)法是有一定問(wèn)題的,第二種方法的話有一定的局限性,為什么我會(huì)這么說(shuō)呢,先看一道題吧LeetCode452:用最小數(shù)量的箭引爆氣球這道題。
有一些球形氣球貼在一堵用 XY 平面表示的墻面上。墻面上的氣球記錄在整數(shù)數(shù)組 points ,
其中points[i] = [xstart, xend] 表示水平直徑在 xstart 和 xend之間的氣球。你不知
道氣球的確切 y 坐標(biāo)。一支弓箭可以沿著 x 軸從不同點(diǎn) 完全垂直 地射出。在坐標(biāo) x 處射出
一支箭,若有一個(gè)氣球的直徑的開(kāi)始和結(jié)束坐標(biāo)為 xstart,xend, 且滿足
xstart ≤ x ≤ xend,則該氣球會(huì)被 引爆 ??梢陨涑龅墓臄?shù)量 沒(méi)有限制 。
弓箭一旦被射出之后,可以無(wú)限地前進(jìn)。給你一個(gè)數(shù)組 points ,返回引爆所有氣球所必須
射出的 最小 弓箭數(shù) 。
這道題的思路也不是很難,我們可以先對(duì)氣球的start進(jìn)行一個(gè)排序,然后關(guān)于氣球的重疊我們可以分為兩種情況,主要分為不重疊的情況和重疊的情況,重疊的情況以?xún)蓚€(gè)重疊的右邊界的最小值來(lái)充當(dāng)邊界,然后遍歷就可以成功。
下面來(lái)看我第一次提交的代碼
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;
// 如果兩個(gè)氣球都有重疊,取兩個(gè)重疊的最小值,如果兩個(gè)沒(méi)有重疊,直接加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;
}
}
好像這樣看來(lái)是沒(méi)有什么問(wèn)題的,但是提交呢,竟然不通過(guò),然后看一下最后執(zhí)行的輸入
[[-2147483646,-2147483645],[2147483646,2147483647]]
我們定位一下錯(cuò)誤,o1[0] - o2[0]這里是不是已經(jīng)越界了呢,事實(shí)是確實(shí)已經(jīng)越界了,具體的結(jié)果留給大家去試了。
我們采用第三種比較方法提交
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;
// 如果兩個(gè)氣球都有重疊,取兩個(gè)重疊的最小值,如果兩個(gè)沒(méi)有重疊,直接加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;
}
}當(dāng)然最后是A了,不過(guò)這個(gè)越界還卡了我好久,沒(méi)有注意到越界問(wèn)題…
到此這篇關(guān)于Java實(shí)例講解Comparator的使用的文章就介紹到這了,更多相關(guān)Java Comparator內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java中的Comparable和Comparator接口
- java?集合工具類(lèi)Collections及Comparable和Comparator排序詳解
- Java元素排序Comparable與Comparator的區(qū)別
- 深入分析Comparable與Comparator及Clonable三個(gè)Java接口
- Java案例使用比較排序器comparator實(shí)現(xiàn)成績(jī)排序
- Java的Comparable,Comparator和Cloneable三大接口詳解
- java中元素排序Comparable和Comparator的區(qū)別
- java Comparator.comparing排序使用示例
相關(guān)文章
java網(wǎng)絡(luò)編程學(xué)習(xí)java聊天程序代碼分享
java聊天程序代碼分享,大家參考使用吧2013-12-12
Spring計(jì)時(shí)器stopwatch使用詳解
這篇文章主要介紹了Spring計(jì)時(shí)器stopwatch使用詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08
利用Intellij Idea連接遠(yuǎn)程服務(wù)器實(shí)現(xiàn)遠(yuǎn)程上傳部署功能
大家在使用Intellij Idea開(kāi)發(fā)程序的時(shí)候,是不是需要部署到遠(yuǎn)程SSH服務(wù)器運(yùn)行呢,當(dāng)然也可以直接在idea軟件內(nèi)容實(shí)現(xiàn)配置部署操作,接下來(lái)通過(guò)本文給大家分享利用Intellij Idea連接遠(yuǎn)程服務(wù)器實(shí)現(xiàn)遠(yuǎn)程上傳部署功能,感興趣的朋友跟隨小編一起看看吧2021-05-05
SpringBoot數(shù)據(jù)訪問(wèn)的實(shí)現(xiàn)
本文主要介紹了SpringBoot數(shù)據(jù)訪問(wèn)的實(shí)現(xiàn),引入各種xxxTemplate,xxxRepository來(lái)簡(jiǎn)化我們對(duì)數(shù)據(jù)訪問(wèn)層的操作,感興趣的可以了解一下2023-11-11
Java中System.currentTimeMillis()計(jì)算方式與時(shí)間單位轉(zhuǎn)換講解
本文詳細(xì)講解了Java中System.currentTimeMillis()計(jì)算方式與時(shí)間單位轉(zhuǎn)換,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-12-12
Java查看變量的數(shù)據(jù)類(lèi)型的三種方法
Java是一門(mén)強(qiáng)類(lèi)型的編程語(yǔ)言,它對(duì)變量的數(shù)據(jù)類(lèi)型有嚴(yán)格的限定,在定義變量時(shí)必須聲明變量的數(shù)據(jù)類(lèi)型,在為變量賦值時(shí)必須賦予與變量同一種類(lèi)型的值,否則程序會(huì)報(bào)錯(cuò), 所以本文給大家介紹了Java查看變量的數(shù)據(jù)類(lèi)型的三種方法,需要的朋友可以參考下2024-10-10
spring?NamedContextFactory在Fegin配置及使用詳解
在我們?nèi)粘m?xiàng)目中,使用FeignClient實(shí)現(xiàn)各系統(tǒng)接口調(diào)用變得更加簡(jiǎn)單,?在各個(gè)系統(tǒng)集成過(guò)程中,難免會(huì)遇到某些系統(tǒng)的Client需要特殊的配置、返回讀取等需求。Feign使用NamedContextFactory來(lái)為每個(gè)Client模塊構(gòu)造單獨(dú)的上下文(ApplicationContext)2023-11-11

