Java實例講解Comparator的使用
前言
今天刷個題,遇到一個很有趣的問題,關于Comparator的使用,感覺也是一個關于寫代碼的一些小細節(jié)的問題
關于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; } } });
原題
細心的同學就會發(fā)現了,第一種寫法是有一定問題的,第二種方法的話有一定的局限性,為什么我會這么說呢,先看一道題吧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; } }
好像這樣看來是沒有什么問題的,但是提交呢,竟然不通過,然后看一下最后執(zhí)行的輸入
[[-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了,不過這個越界還卡了我好久,沒有注意到越界問題…
到此這篇關于Java實例講解Comparator的使用的文章就介紹到這了,更多相關Java Comparator內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Spring中的singleton和prototype的實現
這篇文章主要介紹了Spring中的singleton和prototype的實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-07-07springboot?ConfigurationProperties的綁定源碼示例解析
這篇文章主要為大家介紹了springboot?ConfigurationProperties的綁定源碼示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-09-09java開發(fā)MVC三層架構上再加一層Manager層原理詳解
這篇文章主要為大家介紹了MVC三層架構中再加一層Manager層原理的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步2021-10-10mybatis框架之mybatis中dao層開發(fā)的兩種方法
這篇文章主要介紹了mybatis框架之mybatis中dao層開發(fā)的兩種方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-07-07