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

Java實(shí)例講解Comparator的使用

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

前言

今天刷個(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)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java實(shí)現(xiàn)學(xué)生成績(jī)管理系統(tǒng)

    Java實(shí)現(xiàn)學(xué)生成績(jī)管理系統(tǒng)

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

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

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

    Jmeter工作原理及常見錯(cuò)誤解析

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

    SpringBoot解析JSON數(shù)據(jù)的三種方案

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

    Spring中的singleton和prototype的實(shí)現(xiàn)

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

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

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

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

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

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

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

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

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

    Java游戲開發(fā)之俄羅斯方塊的實(shí)現(xiàn)

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

最新評(píng)論