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

Java求兩集合的交集、并集、差集實(shí)例

 更新時(shí)間:2024年08月02日 11:15:43   作者:貓飯_ACE  
這篇文章主要介紹了Java求兩集合的交集、并集、差集實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

一、內(nèi)置函數(shù)實(shí)現(xiàn)

  • removeAll方法:從list中刪除指定集合中包含的所有元素。
  • retainAll方法:從list中刪除指定集合中不包含的所有元素。
  • addAll方法:用來向Set集合添加另一個(gè)集合對(duì)象所包含的所有內(nèi)容。
public class CollectionTest {
 
    public static void main(String[] args) {
        List<String> list1 = new ArrayList<>();
        List<String> list2 = new ArrayList<>();
 
        list1.add("a");
        list1.add("b");
        list1.add("c");
 
        list2.add("b");
        list2.add("e");
        list2.add("d");
 
        //求交集
        list1.retainAll(list2);
        System.out.println(list1.toString()); // b
 
        //求并集
        list1.removeAll(list2);
        list1.addAll(list2);
        System.out.println(list1.toString());  // a c b e d
 
        //求差集(list1有而list2沒有)
        list1.removeAll(list2);   // a c
 
    }
}

二、for循環(huán)遍歷實(shí)現(xiàn) 求兩個(gè)集合的交集

利用集合的contains方法,來對(duì)比第二個(gè)集合中是否存在相同的元素的方法,同時(shí)將交集結(jié)果返回。時(shí)間復(fù)雜度是O(n)。 

contains方法:用于判斷l(xiāng)ist集合是否包含某個(gè)元素。

public List<Object> intersectionForList_1(List<Object> arr1, List<Object> arr2) {
    long startTime = System.currentTimeMillis();
    List<Object> result = new ArrayList<>();
    for (Object arr : arr1) {
        if (arr2.contains(arr)) {
            result.add(arr);
         }
    }
    long endTime = System.currentTimeMillis();
    log.info("intersectionForList_1:" + (endTime - startTime));
    return result;
}

三、使用Java 8 Stream API 求兩個(gè)集合的交集

首先把兩個(gè)集合轉(zhuǎn)換成Stream,然后使用filter()方法篩選出交集元素,最后把結(jié)果轉(zhuǎn)換成集合。 時(shí)間復(fù)雜度是O(n)。

.stream().filter()方法:來篩選出滿足條件的對(duì)象,最終返回的篩選過后的列表。

Collectors.toList()和Collectors.toSet()方法都是將map后的stream轉(zhuǎn)換為一個(gè)列表對(duì)象,toSet()會(huì)去重重復(fù)的對(duì)象

Set<Integer> set1 = new HashSet<>();
set1.add(1);
set1.add(2);
set1.add(3);
set1.add(4);

Set<Integer> set2 = new HashSet<>();
set2.add(3);
set2.add(4);
set2.add(5);
Set<Integer> intersection = set1.stream().filter(set2::contains).collect(Collectors.toSet());
System.out.println(intersection); // 輸出 [3, 4]

四、使用迭代器求兩個(gè)集合的交集

public List<Object> intersectionForList_2(List<Object> arr1, List<Object> arr2) {

      List<Object> resultList = new ArrayList<>();
 
      List<Object> maxList;
      List<Object> minList;
      if (arr1.size()>arr2.size()){
          maxList = arr1;
          minList = arr2;
      }else {
          maxList = arr2;
          minList = arr1;
      }
 
      Iterator<Object> iterator = maxList.iterator();
      while (iterator.hasNext()){
          Object next = iterator.next();
          if (minList.contains(next)){
              resultList.add(next);
          }
      }
 

      return resultList;
  }

五、使用map 求兩個(gè)集合的交集

首先將list集合中的元素依次存入一個(gè)map中去,然后再以map的get方法來判斷是否存在這樣的元素。

這種方法的效率最高,在10萬條數(shù)據(jù)的測(cè)試下,這種方法耗時(shí)僅僅在十幾毫秒,而其他方法在將近一百多毫秒。

在百萬條數(shù)據(jù)進(jìn)行對(duì)比處理的時(shí)候,使用map特性的方法時(shí)間消耗大概在40毫秒左右,但是其他方法要將近10秒鐘,

所以在對(duì)于大量數(shù)據(jù)的處理過程中,還是非常建議使用這種方法的。

public List<Object> intersectionForList_3(List<Object> arr1, List<Object> arr2) {

    List<Object> resultList = new ArrayList<>();
    Map<String,Object> map = new HashMap<>();
    arr1.forEach(a1->{
         map.put(a1+"",a1);
    });
 
    arr2.forEach(a2->{
        Object obj = map.get(a2 + "");
        if (obj!=null){
            resultList.add(obj);
        }
    });

    return resultList;
}

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java之PreparedStatement的使用詳解

    Java之PreparedStatement的使用詳解

    這篇文章主要介紹了Java之PreparedStatement的使用詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • 詳解java如何解析和生成sql

    詳解java如何解析和生成sql

    JSQLParser?是一個(gè)開源的?Java?庫,用于解析?SQL?語句并將其轉(zhuǎn)換為抽象語法樹,下面我們就來看看java是如何使用JSQLParser解析和生成sql的吧
    2024-12-12
  • Java Spring框架簡介與Spring IOC詳解

    Java Spring框架簡介與Spring IOC詳解

    Spring 框架是一個(gè)輕量級(jí)的解決方案,可以一站式地構(gòu)建企業(yè)級(jí)應(yīng)用。它是為了解決 企業(yè)應(yīng)用開發(fā)的復(fù)雜性而創(chuàng)建的。Spring 使用基本的 JavaBean 來完成以前只可能由 EJB 完成的事情。IOC 是 Inversion of Control 的縮寫,多數(shù)書籍翻譯成控制反轉(zhuǎn)
    2021-09-09
  • spring boot + quartz集群搭建的完整步驟

    spring boot + quartz集群搭建的完整步驟

    這篇文章主要給大家介紹了關(guān)于spring boot + quartz集群搭建的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-05-05
  • Java基礎(chǔ)之序列化與反序列化詳解

    Java基礎(chǔ)之序列化與反序列化詳解

    這篇文章主要介紹了Java基礎(chǔ)之序列化與反序列化詳解,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java基礎(chǔ)的小伙伴們有很好的幫助,需要的朋友可以參考下
    2021-04-04
  • tk.mybatis實(shí)現(xiàn)uuid主鍵生成的示例代碼

    tk.mybatis實(shí)現(xiàn)uuid主鍵生成的示例代碼

    本文主要介紹了tk.mybatis實(shí)現(xiàn)uuid主鍵生成的示例代碼,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • 深入了解Spring中的FactoryBean

    深入了解Spring中的FactoryBean

    這篇文章主要介紹了深入了解Spring中的FactoryBean,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • String實(shí)例化及static final修飾符實(shí)現(xiàn)方法解析

    String實(shí)例化及static final修飾符實(shí)現(xiàn)方法解析

    這篇文章主要介紹了String實(shí)例化及static final修飾符實(shí)現(xiàn)方法解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • SpringBoot讀取yaml文件操作詳解

    SpringBoot讀取yaml文件操作詳解

    YAML 是 “YAML Ain’t Markup Language”(YAML 不是一種標(biāo)記語言)的遞歸縮寫。在開發(fā)的這種語言時(shí),YAML 的意思其實(shí)是:“Yet Another Markup Language”(仍是一種標(biāo)記語言),本文給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09
  • APP轉(zhuǎn)盤抽獎(jiǎng)Java服務(wù)端接口詳解

    APP轉(zhuǎn)盤抽獎(jiǎng)Java服務(wù)端接口詳解

    這篇文章主要為大家詳細(xì)介紹了APP轉(zhuǎn)盤抽獎(jiǎng)Java服務(wù)端接口,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-01-01

最新評(píng)論