最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

匯總Java中List 去重的 6 種方法

 更新時(shí)間:2022年05月13日 09:29:51   作者:? Java中文社群?  ?  
這篇文章主要介紹了匯總Java中List 去重的 6 種方法,文章圍繞主題展開List去重的方法,具有一定的參考價(jià)值,需要的小伙伴可以參考一下

前言:

在日常的業(yè)務(wù)開發(fā)中,偶爾會(huì)遇到需要將 List 集合中的重復(fù)數(shù)據(jù)去除掉的場(chǎng)景。這個(gè)時(shí)候可能有同學(xué)會(huì)問:為什么不直接使用 Set 或者 LinkedHashSet 呢?這樣不就沒有重復(fù)數(shù)據(jù)的問題了嘛?

不得不說(shuō),能提這個(gè)問題的同學(xué)很機(jī)智,一眼就看到了問題的本質(zhì)。

但是,在實(shí)際的業(yè)務(wù)開發(fā)中遇到的情況會(huì)更復(fù)雜。比如,List 集合可能是歷史遺留問題,也有可能是調(diào)用接口返回的類型限制,只能使用 List 接收,又或者是代碼寫了一半,在做多個(gè)集合合并的時(shí)候才發(fā)現(xiàn)了這個(gè)問題,總之造成問題的原因有很多種,這里就不一一列舉了。

當(dāng)發(fā)現(xiàn)這個(gè)問題之后,如果可以通過(guò)改造原有代碼,把原來(lái)的 List 類型替換成 Set 類型,那就可以直接修改集合的類型即可。但如果壓根就修改不了,或者是修改的成本太大,那接下來(lái)這 6 種去重的方法,將幫你將解決問題。

前置知識(shí)

正式開始之前,先來(lái)搞懂兩組概念:無(wú)序集合和有序集合 & 無(wú)序和有序。因?yàn)榻酉聛?lái)的方法實(shí)現(xiàn)中,會(huì)反復(fù)提及這兩組概念,所以有必要在正式開始之前,先把它們搞清楚。

無(wú)序集合

無(wú)序集合是指,數(shù)據(jù)讀取的順序和數(shù)據(jù)插入的順序是不一致的。例如,插入集合的順序是:1、5、3、7,而集合的讀取順序竟然是:1、3、5、7。

有序集合

有序集合的概念和無(wú)序集合的概念正好相反,它是指集合的讀取順序和插入順序是一致的。例如,插入數(shù)據(jù)的順序是:1、5、3、7,那么讀取的順序也是:1、5、3、7。

有序和無(wú)序

通過(guò)上面的無(wú)序集合和有序集合,我們可以得出有序和無(wú)序的概念。 有序指的是數(shù)據(jù)的排列順序和讀取順序符合我們的預(yù)期就叫做有序。而無(wú)序指的是數(shù)據(jù)的排列順序和讀取順序不符合我們的預(yù)期就叫做無(wú)序。

PS:如果對(duì)于有序和無(wú)序的概念不是很清楚也沒關(guān)系,通過(guò)下面的事例,我們可以進(jìn)一步的理解它們的含義。

方法1:contains判斷去重(有序)

要進(jìn)行數(shù)據(jù)去重,我們首先想到的是新建一個(gè)集合,然后循環(huán)原來(lái)的集合,每次循環(huán)判斷原集合中的循環(huán)項(xiàng),如果當(dāng)前循環(huán)的數(shù)據(jù),沒有在新集合中存在就插入,已經(jīng)存在了就舍棄,這樣當(dāng)循環(huán)執(zhí)行完,我們就得到了一個(gè)沒有重復(fù)元素的集合了,實(shí)現(xiàn)代碼如下:

public class ListDistinctExample {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<Integer>() {{
            add(1);
            add(3);
            add(5);
            add(2);
            add(1);
            add(3);
            add(7);
            add(2);
        }};
        System.out.println("原集合:" + list);
        method(list);
    }

    /**
     * 自定義去重
     * @param list
     */
    public static void method(List<Integer> list) {
        // 新集合
        List<Integer> newList = new ArrayList<>(list.size());
        list.forEach(i -> {
            if (!newList.contains(i)) { // 如果新集合中不存在則插入
                newList.add(i);
            }
        });
        System.out.println("去重集合:" + newList);
    }
}

以上程序執(zhí)行的結(jié)果,如下所示:

 此方法的優(yōu)點(diǎn)的:理解起來(lái)比較簡(jiǎn)單,并且最終得到的集合也是有序的,這里的有序指的是新集合的排列順序和原集合的順序是一致的;但缺點(diǎn)是實(shí)現(xiàn)代碼有點(diǎn)多,不夠簡(jiǎn)潔優(yōu)雅。

方法2:迭代器去重(無(wú)序)

自定義 List 去重,除了上面的新建集合之外,我們也可以使用迭代器循環(huán)判斷每一項(xiàng)數(shù)據(jù),如果當(dāng)前循環(huán)的數(shù)據(jù),在集合中存在兩份或兩份以上,就將當(dāng)前的元素刪除掉,這樣循環(huán)完之后,也可以得到一個(gè)沒有重復(fù)數(shù)據(jù)的集合,

實(shí)現(xiàn)代碼如下:

public class ListDistinctExample {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<Integer>() {{
            add(1);
            add(3);
            add(5);
            add(2);
            add(1);
            add(3);
            add(7);
            add(2);
        }};
        System.out.println("原集合:" + list);
        method_1(list);
    }

    /**
     * 使用迭代器去重
     * @param list
     */
    public static void method_1(List<Integer> list) {
        Iterator<Integer> iterator = list.iterator();
        while (iterator.hasNext()) {
            // 獲取循環(huán)的值
            Integer item = iterator.next();
            // 如果存在兩個(gè)相同的值
            if (list.indexOf(item) != list.lastIndexOf(item)) {
                // 移除最后那個(gè)相同的值
                iterator.remove();
            }
        }
        System.out.println("去重集合:" + list);
    }
}

以上程序執(zhí)行的結(jié)果,如下所示: 

 此方法的實(shí)現(xiàn)比上一種方法的實(shí)現(xiàn)代碼要少一些,并且不需要新建集合,但此方法得到的新集合是無(wú)序的,也就是新集合的排列順序和原集合不一致,因此也不是最優(yōu)的解決方案。

方法3:HashSet去重(無(wú)序)

我們知道 HashSet 天生具備“去重”的特性,那我們只需要將 List 集合轉(zhuǎn)換成 HashSet 集合就可以了,

實(shí)現(xiàn)代碼如下:

public class ListDistinctExample {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<Integer>() {{
            add(1);
            add(3);
            add(5);
            add(2);
            add(1);
            add(3);
            add(7);
            add(2);
        }};
        System.out.println("原集合:" + list);
        method_2(list);
    }

    /**
     * 使用 HashSet 去重
     * @param list
     */
    public static void method_2(List<Integer> list) {
        HashSet<Integer> set = new HashSet<>(list);
        System.out.println("去重集合:" + set);
    }
}

以上程序執(zhí)行的結(jié)果,如下所示: 

 此方法的實(shí)現(xiàn)代碼較為簡(jiǎn)潔,但缺點(diǎn)是 HashSet 會(huì)自動(dòng)排序,這樣新集合的數(shù)據(jù)排序就和原集合不一致了,如果對(duì)集合的順序有要求,那么此方法也不能滿足當(dāng)前需求。

方法4:LinkedHashSet去重(有序)

既然 HashSet 會(huì)自動(dòng)排序不能滿足需求,那就使用 LinkedHashSet,它既能去重又能保證集合的順序,實(shí)現(xiàn)代碼如下:

public class ListDistinctExample {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<Integer>() {{
            add(1);
            add(3);
            add(5);
            add(2);
            add(1);
            add(3);
            add(7);
            add(2);
        }};
        System.out.println("原集合:" + list);
        method_3(list);
    }

    /**
     * 使用 LinkedHashSet 去重
     * @param list
     */
    public static void method_3(List<Integer> list) {
        LinkedHashSet<Integer> set = new LinkedHashSet<>(list);
        System.out.println("去重集合:" + set);
    }
}

以上程序執(zhí)行的結(jié)果,如下所示: 

 從上述代碼和執(zhí)行結(jié)果可以看出,LinkedHashSet 是到目前為止,實(shí)現(xiàn)比較簡(jiǎn)單,且最終生成的新集合與原集合順序保持一致的實(shí)現(xiàn)方法,是我們可以考慮使用的一種去重方法。

方法5:TreeSet去重(無(wú)序)

除了以上的 Set 集合之外,我們還可以使用 TreeSet 集合來(lái)實(shí)現(xiàn)去重功能,實(shí)現(xiàn)代碼如下:

public class ListDistinctExample {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<Integer>() {{
            add(1);
            add(3);
            add(5);
            add(2);
            add(1);
            add(3);
            add(7);
            add(2);
        }};
        System.out.println("原集合:" + list);
        method_4(list);
    }

    /**
     * 使用 TreeSet 去重(無(wú)序)
     * @param list
     */
    public static void method_4(List<Integer> list) {
        TreeSet<Integer> set = new TreeSet<>(list);
        System.out.println("去重集合:" + set);
    }
}

以上程序執(zhí)行的結(jié)果,如下所示: 

 比較遺憾的是,TreeSet 雖然實(shí)現(xiàn)起來(lái)也比較簡(jiǎn)單,但它有著和 HashSet 一樣的問題,會(huì)自動(dòng)排序,因此也不能滿足我們的需求。

方法6:Stream去重(有序)

JDK 8 為我們帶來(lái)了一個(gè)非常實(shí)用的方法 Stream,使用它可以實(shí)現(xiàn)很多功能,

比如下面的去重功能:

public class ListDistinctExample {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<Integer>() {{
            add(1);
            add(3);
            add(5);
            add(2);
            add(1);
            add(3);
            add(7);
            add(2);
        }};
        System.out.println("原集合:" + list);
        method_5(list);
    }

    /**
     * 使用 Stream 去重
     * @param list
     */
    public static void method_5(List<Integer> list) {
        list = list.stream().distinct().collect(Collectors.toList());
        System.out.println("去重集合:" + list);
    }
}

以上程序執(zhí)行的結(jié)果,如下所示: 

 Stream 實(shí)現(xiàn)去重功能和其他方法不同的是,它不用新創(chuàng)建集合,使用自身接收一個(gè)去重的結(jié)果就可以了,并且實(shí)現(xiàn)代碼也很簡(jiǎn)潔,并且去重后的集合順序也和原集合的順序保持一致,是我們最優(yōu)先考慮的去重方法。

總結(jié)

本文我們介紹了 6 種集合去重的方法,其中實(shí)現(xiàn)最簡(jiǎn)潔,且去重之后的順序能和原集合保持一致的實(shí)現(xiàn)方法,只有兩種:LinkedHashSet 去重和 Stream 去重,而后一種去重方法無(wú)需借助新集合,是我們優(yōu)先考慮的去重方法。

到此這篇關(guān)于匯總Java中List 去重的 6 種方法的文章就介紹到這了,更多相關(guān)List 去重 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

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

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

    JSON(JavaScript Object Notation) 是一種輕量級(jí)的數(shù)據(jù)交換格式,易于人閱讀和編寫,同時(shí)也易于機(jī)器解析和生成,本文給大家介紹了SpringBoot解析JSON數(shù)據(jù)的三種方案,需要的朋友可以參考下
    2024-03-03
  • Jackson自定義序列化與反序列化注解詳解

    Jackson自定義序列化與反序列化注解詳解

    這篇文章主要介紹了Jackson自定義序列化與反序列化注解詳解,某些場(chǎng)景下,我們使用Jackson對(duì)數(shù)據(jù)進(jìn)行序列化或反序列化的時(shí)候,需要對(duì)某些數(shù)據(jù)進(jìn)行特殊處理,需要的朋友可以參考下
    2023-11-11
  • Java中@JSONField注解用法、場(chǎng)景與實(shí)踐詳解

    Java中@JSONField注解用法、場(chǎng)景與實(shí)踐詳解

    這篇文章主要給大家介紹了關(guān)于Java中@JSONField注解用法、場(chǎng)景與實(shí)踐的相關(guān)資料,并結(jié)合實(shí)際應(yīng)用場(chǎng)景,幫助開發(fā)者在項(xiàng)目中更高效地處理JSON數(shù)據(jù),文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-12-12
  • Java生成隨機(jī)時(shí)間的簡(jiǎn)單隨機(jī)算法

    Java生成隨機(jī)時(shí)間的簡(jiǎn)單隨機(jī)算法

    今天小編就為大家分享一篇關(guān)于Java生成隨機(jī)時(shí)間的簡(jiǎn)單隨機(jī)算法,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-01-01
  • MyBatis高級(jí)映射及延遲加載的實(shí)現(xiàn)

    MyBatis高級(jí)映射及延遲加載的實(shí)現(xiàn)

    MyBatis在處理對(duì)象關(guān)系映射時(shí),多對(duì)一關(guān)系是常見的場(chǎng)景,本文就來(lái)介紹了MyBatis高級(jí)映射及延遲加載的實(shí)現(xiàn),感興趣的可以了解一下
    2024-11-11
  • idea前后跳轉(zhuǎn)箭頭的快捷鍵

    idea前后跳轉(zhuǎn)箭頭的快捷鍵

    這篇文章主要介紹了idea前后跳轉(zhuǎn)箭頭的快捷鍵,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-02-02
  • java中instanceof 關(guān)鍵字作用和實(shí)際用途詳解

    java中instanceof 關(guān)鍵字作用和實(shí)際用途詳解

    這篇文章主要介紹了java中instanceof 關(guān)鍵字作用和實(shí)際用途,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04
  • springboot @Value實(shí)現(xiàn)獲取計(jì)算機(jī)中絕對(duì)路徑文件的內(nèi)容

    springboot @Value實(shí)現(xiàn)獲取計(jì)算機(jī)中絕對(duì)路徑文件的內(nèi)容

    這篇文章主要介紹了springboot @Value實(shí)現(xiàn)獲取計(jì)算機(jī)中絕對(duì)路徑文件的內(nèi)容,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。
    2021-09-09
  • idea解決程序包不存在報(bào)錯(cuò)的八種解決方法

    idea解決程序包不存在報(bào)錯(cuò)的八種解決方法

    這篇文章主要介紹了idea解決程序包不存在報(bào)錯(cuò)的八種解決方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2024-02-02
  • 深入理解Java 線程池

    深入理解Java 線程池

    這篇文章主要介紹了Java 線程池的相關(guān)資料,文中講解非常細(xì)致,幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07

最新評(píng)論

广灵县| 永年县| 盈江县| 元朗区| 巴楚县| 中卫市| 郴州市| 修武县| 志丹县| 常山县| 汶上县| 邵阳县| 宿松县| 垦利县| 于都县| 镇宁| 甘谷县| 新和县| 田东县| 罗山县| 福鼎市| 温州市| 抚松县| 葵青区| 通城县| 丰原市| 凯里市| 池州市| 黄陵县| 丹江口市| 陵川县| 阳江市| 门头沟区| 文昌市| 山西省| 宣威市| 张家口市| 徐闻县| 台南县| 乌兰察布市| 汉川市|