欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java實例講解Comparator的使用

 更新時間:2022年11月09日 16:17:45   作者:宏遠十一冠王  
我們先介紹一下comparator,我們后文稱為比較器。比較器實際上是一個實現了comparator interface是一個實例,在Arrays.sort方法我們可以提供這樣一個實例,即使被排序的object沒有實現comparable接口,我們也可以排序了

前言

今天刷個題,遇到一個很有趣的問題,關于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ù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java實現學生成績管理系統(tǒng)

    Java實現學生成績管理系統(tǒng)

    這篇文章主要為大家詳細介紹了Java實現學生成績管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • 詳解Java序列化如何破壞單例模式

    詳解Java序列化如何破壞單例模式

    這篇文章主要為大家詳細介紹了Java序列化是如何破壞單例模式的,文中的示例代碼講解詳細,具有一定的借鑒價值,感興趣的小伙伴可以學習一下
    2023-12-12
  • Jmeter工作原理及常見錯誤解析

    Jmeter工作原理及常見錯誤解析

    這篇文章主要介紹了Jmeter工作原理及常見錯誤解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-09-09
  • SpringBoot解析JSON數據的三種方案

    SpringBoot解析JSON數據的三種方案

    JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式,易于人閱讀和編寫,同時也易于機器解析和生成,本文給大家介紹了SpringBoot解析JSON數據的三種方案,需要的朋友可以參考下
    2024-03-03
  • Spring中的singleton和prototype的實現

    Spring中的singleton和prototype的實現

    這篇文章主要介紹了Spring中的singleton和prototype的實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-07-07
  • springboot?ConfigurationProperties的綁定源碼示例解析

    springboot?ConfigurationProperties的綁定源碼示例解析

    這篇文章主要為大家介紹了springboot?ConfigurationProperties的綁定源碼示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09
  • java開發(fā)MVC三層架構上再加一層Manager層原理詳解

    java開發(fā)MVC三層架構上再加一層Manager層原理詳解

    這篇文章主要為大家介紹了MVC三層架構中再加一層Manager層原理的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2021-10-10
  • mybatis框架之mybatis中dao層開發(fā)的兩種方法

    mybatis框架之mybatis中dao層開發(fā)的兩種方法

    這篇文章主要介紹了mybatis框架之mybatis中dao層開發(fā)的兩種方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • log4j配置失效日志中打印Debug信息問題

    log4j配置失效日志中打印Debug信息問題

    這篇文章主要介紹了log4j配置失效日志中打印Debug信息問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Java游戲開發(fā)之俄羅斯方塊的實現

    Java游戲開發(fā)之俄羅斯方塊的實現

    俄羅斯方塊是一個最初由阿列克謝帕吉特諾夫在蘇聯(lián)設計和編程的益智類視頻游戲。本文和大家分享了利用Java語言實現這一經典的小游戲的示例代碼,需要的可以參考一下
    2022-05-05

最新評論