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

Java關(guān)于List集合去重方案詳細(xì)介紹

 更新時(shí)間:2021年09月15日 10:36:36   作者:JavaEdge.  
實(shí)際項(xiàng)目開發(fā)中,很多業(yè)務(wù)場(chǎng)景下都會(huì)遇見集合去重。在說(shuō)到List集合去重之前,首先我們回顧下普通類型的list如何去重

1 常規(guī)去重

碰到List去重的問(wèn)題,除了遍歷去重,我們常常想到利用Set集合不允許重復(fù)元素的特點(diǎn),通過(guò)List和Set互轉(zhuǎn),來(lái)去掉重復(fù)元素。

// 遍歷后判斷賦給另一個(gè)List集合,保持原來(lái)順序
public static void ridRepeat1(List<String> list) {
    System.out.println("list = [" + list + "]");
    List<String> listNew = new ArrayList<String>();
    for (String str : list) {
        if (!listNew.contains(str)) {
            listNew.add(str);
        }
    }
    System.out.println("listNew = [" + listNew + "]");
}

// Set集合去重,保持原來(lái)順序
public static void ridRepeat2(List<String> list) {
    System.out.println("list = [" + list + "]");
    List<String> listNew = new ArrayList<String>();
    Set set = new HashSet();
    for (String str : list) {
        if (set.add(str)) {
            listNew.add(str);
        }
    }
    System.out.println("listNew = [" + listNew + "]");
}

// Set去重     由于Set(HashSet)的無(wú)序性,不會(huì)保持原來(lái)順序
public static void ridRepeat3(List<String> list) {
    System.out.println("list = [" + list + "]");
    Set set = new HashSet();
    List<String> listNew = new ArrayList<String>();
    set.addAll(list);
    listNew.addAll(set);
    System.out.println("listNew = [" + listNew + "]");
}

// Set通過(guò)HashSet去重(將ridRepeat3方法縮減為一行) 無(wú)序
public static void ridRepeat4(List<String> list) {
    System.out.println("list = [" + list + "]");
    List<String> listNew = new ArrayList<String>(new HashSet(list));
    System.out.println("listNew = [" + listNew + "]");
}

// Set通過(guò)TreeSet去重   會(huì)按字典順序重排序
public static void ridRepeat5(List<String> list) {
    System.out.println("list = [" + list + "]");
    List<String> listNew = new ArrayList<String>(new TreeSet<String>(list));
    System.out.println("listNew = [" + listNew + "]");
}

// Set通過(guò)LinkedHashSet去重  保持原來(lái)順序
public static void ridRepeat6(List<String> list) {
    System.out.println("list = [" + list + "]");
    List<String> listNew = new ArrayList<String>(new LinkedHashSet<String>(list));
    System.out.println("listNew = [" + listNew + "]");
}

stream去重

  //利用java8的stream去重
  List uniqueList = list.stream().distinct().collect(Collectors.toList());
  System.out.println(uniqueList.toString());

上面的方法在List元素為基本數(shù)據(jù)類型及String類型時(shí)是可以的,但是如果List集合元素為對(duì)象,卻失效了!

2 對(duì)象去重

可利用for循環(huán)遍歷的方式進(jìn)行判斷去重,很簡(jiǎn)單不贅述,看如下方法:

2.1 stream去重

// 根據(jù)name屬性去重
List<User> uniqueNameList = userList
        .stream()
        .collect(collectingAndThen(
                toCollection(() -> new TreeSet<>(comparing(User::getName))), ArrayList::new)
        );

System.out.println("根據(jù)name去重后集合元素:" + uniqueNameList.toString());

// 根據(jù)name,age屬性去重
List<User> uniqueNameAndAgeList = userList
        .stream()
        .collect(collectingAndThen(
                toCollection(() -> new TreeSet<>(comparing(o -> o.getName() + ";" + o.getAge()))), ArrayList::new)
        );

System.out.println("根據(jù)name,age去重后集合元素:" + uniqueNameAndAgeList.toString());

輸出結(jié)果:

重寫equals()、hashCode()

//重寫equals方法
 @Override
    public boolean equals(Object obj) {
        User user = (User) obj;
        return name.equals(user.getName()) && (age==user.getAge());
    }

//重寫hashCode方法
    @Override
    public int hashCode() {
        String str = name + age;
        return str.hashCode();
    }

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

相關(guān)文章

  • java使用DOM對(duì)XML文檔進(jìn)行增刪改查操作實(shí)例代碼

    java使用DOM對(duì)XML文檔進(jìn)行增刪改查操作實(shí)例代碼

    這篇文章主要介紹了java使用DOM對(duì)XML文檔進(jìn)行增刪改查操作實(shí)例代碼,實(shí)例涉及對(duì)xml文檔的增刪改查,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-02-02
  • java異步調(diào)用的4種實(shí)現(xiàn)方法

    java異步調(diào)用的4種實(shí)現(xiàn)方法

    日常開發(fā)中,會(huì)經(jīng)常遇到說(shuō),前臺(tái)調(diào)服務(wù),本文主要介紹了java異步調(diào)用的4種實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • 深入理解Java8雙冒號(hào)::的使用

    深入理解Java8雙冒號(hào)::的使用

    這篇文章主要介紹了深入理解Java8雙冒號(hào)::的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • 詳解Java豆瓣電影爬蟲——小爬蟲成長(zhǎng)記(附源碼)

    詳解Java豆瓣電影爬蟲——小爬蟲成長(zhǎng)記(附源碼)

    這篇文章主要介紹了詳解Java豆瓣電影爬蟲——小爬蟲成長(zhǎng)記(附源碼) ,具有一定的參考價(jià)值,有需要的可以了解一下。
    2016-12-12
  • Spring?AOP?后置處理器使用方式

    Spring?AOP?后置處理器使用方式

    這篇文章主要介紹了Spring?AOP?后置處理器使用方式,文章圍繞主題相關(guān)內(nèi)容展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-05-05
  • Spring?Security配置保姆級(jí)教程

    Spring?Security配置保姆級(jí)教程

    Spring?Security是一個(gè)功能強(qiáng)大且可高度自定義的身份驗(yàn)證和訪問(wèn)控制框架。它是保護(hù)基于Spring的應(yīng)用程序的事實(shí)上的標(biāo)準(zhǔn)。Spring?Security是一個(gè)專注于為Java應(yīng)用程序提供身份驗(yàn)證和授權(quán)的框架
    2023-02-02
  • java實(shí)現(xiàn)遞歸菜單樹

    java實(shí)現(xiàn)遞歸菜單樹

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)遞歸菜單樹,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-08-08
  • Java實(shí)現(xiàn)PDF轉(zhuǎn)為線性PDF詳解

    Java實(shí)現(xiàn)PDF轉(zhuǎn)為線性PDF詳解

    線性化PDF文件是PDF文件的一種特殊格式,可以通過(guò)Internet更快地進(jìn)行查看。本文將通過(guò)后端Java程序?qū)崿F(xiàn)將PDF文件轉(zhuǎn)為線性化PDF。感興趣的可以了解一下
    2021-12-12
  • Nacos注冊(cè)中心的部署與用法示例詳解

    Nacos注冊(cè)中心的部署與用法示例詳解

    注冊(cè)中心是微服務(wù)架構(gòu)中的紐帶,類似于“通訊錄”,它記錄了服務(wù)和服務(wù)地址的映射關(guān)系,本文通過(guò)示例代碼給大家介紹Nacos注冊(cè)中心的部署與用法,感興趣的朋友跟隨小編一起看看吧
    2022-02-02
  • SpringBoot lombok(注解@Getter @Setter)詳解

    SpringBoot lombok(注解@Getter @Setter)詳解

    通過(guò)使用Lombok庫(kù),SpringBoot應(yīng)用可以自動(dòng)化生成常用的方法如setter和getter,顯著降低了代碼冗余并提高了開發(fā)效率,Lombok的@Getter和@Setter注解用于自動(dòng)生成屬性的訪問(wèn)和修改方法,而@Data注解則提供了一個(gè)全面的解決方案
    2024-11-11

最新評(píng)論