Java實(shí)例講解Comparator的使用
前言
今天刷個(gè)題,遇到一個(gè)很有趣的問題,關(guān)于Comparator的使用,感覺也是一個(gè)關(guān)于寫代碼的一些小細(xì)節(jié)的問題
關(guān)于Comparator
Comparator是java8新增的一個(gè)比較器,相信大家如果使用過Arrays和Collections的排序方法時(shí),應(yīng)該對(duì)這個(gè)都不陌生,不知道大家都是怎么寫比較器內(nèi)部的代碼
這種寫法應(yīng)該也是大家會(huì)用的方法。
// 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]; } } });
第二種寫法,這種是調(diào)用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); } });
第三種寫法,這種寫法應(yīng)該是非常常見的寫法了。 ```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)了,第一種寫法是有一定問題的,第二種方法的話有一定的局限性,為什么我會(huì)這么說呢,先看一道題吧LeetCode452:用最小數(shù)量的箭引爆氣球這道題。
有一些球形氣球貼在一堵用 XY 平面表示的墻面上。墻面上的氣球記錄在整數(shù)數(shù)組 points ,
其中points[i] = [xstart, xend] 表示水平直徑在 xstart 和 xend之間的氣球。你不知
道氣球的確切 y 坐標(biāo)。一支弓箭可以沿著 x 軸從不同點(diǎn) 完全垂直 地射出。在坐標(biāo) x 處射出
一支箭,若有一個(gè)氣球的直徑的開始和結(jié)束坐標(biāo)為 xstart,xend, 且滿足
xstart ≤ x ≤ xend,則該氣球會(huì)被 引爆 ??梢陨涑龅墓臄?shù)量 沒有限制 。
弓箭一旦被射出之后,可以無限地前進(jìn)。給你一個(gè)數(shù)組 points ,返回引爆所有氣球所必須
射出的 最小 弓箭數(shù) 。
這道題的思路也不是很難,我們可以先對(duì)氣球的start進(jìn)行一個(gè)排序,然后關(guān)于氣球的重疊我們可以分為兩種情況,主要分為不重疊的情況和重疊的情況,重疊的情況以兩個(gè)重疊的右邊界的最小值來充當(dāng)邊界,然后遍歷就可以成功。
下面來看我第一次提交的代碼
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è)沒有重疊,直接加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; } }
好像這樣看來是沒有什么問題的,但是提交呢,竟然不通過,然后看一下最后執(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è)沒有重疊,直接加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了,不過這個(gè)越界還卡了我好久,沒有注意到越界問題…
到此這篇關(guān)于Java實(shí)例講解Comparator的使用的文章就介紹到這了,更多相關(guān)Java Comparator內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java中的Comparable和Comparator接口
- java?集合工具類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實(shí)現(xiàn)學(xué)生成績(jī)管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)學(xué)生成績(jī)管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-04-04SpringBoot解析JSON數(shù)據(jù)的三種方案
JSON(JavaScript Object Notation) 是一種輕量級(jí)的數(shù)據(jù)交換格式,易于人閱讀和編寫,同時(shí)也易于機(jī)器解析和生成,本文給大家介紹了SpringBoot解析JSON數(shù)據(jù)的三種方案,需要的朋友可以參考下2024-03-03Spring中的singleton和prototype的實(shí)現(xiàn)
這篇文章主要介紹了Spring中的singleton和prototype的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07springboot?ConfigurationProperties的綁定源碼示例解析
這篇文章主要為大家介紹了springboot?ConfigurationProperties的綁定源碼示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09java開發(fā)MVC三層架構(gòu)上再加一層Manager層原理詳解
這篇文章主要為大家介紹了MVC三層架構(gòu)中再加一層Manager層原理的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-10-10mybatis框架之mybatis中dao層開發(fā)的兩種方法
這篇文章主要介紹了mybatis框架之mybatis中dao層開發(fā)的兩種方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07Java游戲開發(fā)之俄羅斯方塊的實(shí)現(xiàn)
俄羅斯方塊是一個(gè)最初由阿列克謝帕吉特諾夫在蘇聯(lián)設(shè)計(jì)和編程的益智類視頻游戲。本文和大家分享了利用Java語言實(shí)現(xiàn)這一經(jīng)典的小游戲的示例代碼,需要的可以參考一下2022-05-05