`

java 两个list 交集 并集 差集 去重复并集

 
阅读更多

前提需要明白List是引用类型,引用类型采用引用传递。

  我们经常会遇到一些需求求集合的交集、差集、并集。例如下面两个集合:

复制代码
        List<String> list1 = new ArrayList<String>();
        list1.add("A");
        list1.add("B");

        List<String> list2 = new ArrayList<String>();
        list2.add("B");
        list2.add("C");
复制代码

 

 0.求差集

  例如,求List1中有的但是List2中没有的元素:

    public static void test3(List list1, List list2) {
        list1.removeAll(list2);
        System.out.println(list1);
    }

结果:

[A]

 

查看ArrayList的removeAll的源码

    public boolean removeAll(Collection<?> c) {
        Objects.requireNonNull(c);
        return batchRemove(c, false);
    } 

 

再查看batchRemove的源码:(如果传的第二个参数是false,保留差集;如果传的是true,保留的是交集)

复制代码
    private boolean batchRemove(Collection<?> c, boolean complement) {
        final Object[] elementData = this.elementData;
        int r = 0, w = 0;
        boolean modified = false;
        try {
            for (; r < size; r++)
                if (c.contains(elementData[r]) == complement)
                    elementData[w++] = elementData[r];
        } finally {
            // Preserve behavioral compatibility with AbstractCollection,
            // even if c.contains() throws.
            if (r != size) {
                System.arraycopy(elementData, r,
                                 elementData, w,
                                 size - r);
                w += size - r;
            }
            if (w != size) {
                // clear to let GC do its work
                for (int i = w; i < size; i++)
                    elementData[i] = null;
                modCount += size - w;
                size = w;
                modified = true;
            }
        }
        return modified;
    }
复制代码

 

  是重新定义elementData数组的元素,下面代码的作用是将本集合中不包含另一个集合的元素重新加入元素,以此实现删除的功能(注意上面调用的方法传的参数是false,也就是不包含的元素得以保留,实现差集的功能)

if (c.contains(elementData[r]) == complement)
elementData[w++] = elementData[r];

 

1.求并集(不去重)---将一个集合全部加入另一个集合

    public static void test(List list1, List list2) {
        list1.addAll(list2);
        System.out.println(list1);
    }

结果:

[A, B, B, C]

 

查看ArayList的addAll()源码是数组复制:

复制代码
    public boolean addAll(Collection<? extends E> c) {
        Object[] a = c.toArray();
        int numNew = a.length;
        ensureCapacityInternal(size + numNew);  // Increments modCount
        System.arraycopy(a, 0, elementData, size, numNew);
        size += numNew;
        return numNew != 0;
    }
复制代码

 

再查看System的arraycopy发现是一个native方法(本地方法):---其实system类的好多方法都是native方法

    public static native void arraycopy(Object src,  int  srcPos,
                                        Object dest, int destPos,
                                        int length);

 

2.求并集(去重)

  例如:求List1和List2的并集,并实现去重。

    思路是:先将list中与list2重复的去掉,之后将list2的元素全部添加进去。

    public static void test1(List list1, List list2) {
        list1.removeAll(list2);
        list1.addAll(list2);
        System.out.println(list1);
    }

结果:

[A, B, C]

 

3.求交集

  例如:求List1和List2中都有的元素。

    public static void test2(List list1, List list2) {
        list1.retainAll(list2);
        System.out.println(list1);
    }

结果:

[B]

 

在上面2的实验过程中,我们知道batchRemove(Collection,true)也是求交集,所以猜想  retainAll 内部应该是调用 batchRemove(Collection,true),查看ArrayList的源码如下:

    public boolean retainAll(Collection<?> c) {
        Objects.requireNonNull(c);
        return batchRemove(c, true);
    }

 

分享到:
评论

相关推荐

    C# 两个datatable中的数据快速比较返回交集 并集或差集

    2. **并集(Union)**:包含两个DataTable所有不重复行的集合。 3. **差集(Difference)**:在一个DataTable中存在的,但在另一个DataTable中不存在的行集合。 以下是一个简单的步骤来实现这些操作: 1. **初始化...

    Python 两个列表的差集、并集和交集实现代码

    本文将详细介绍如何在 Python 中实现两个列表之间的差集、并集以及交集操作,并提供相应的示例代码。 #### 一、差集 **定义:** 两个集合 A 和 B 的差集(A - B)是指属于集合 A 但不属于集合 B 的所有元素组成的...

    C++实现字符串求交集、并集、差集

    要实现两个集合的交集,可以遍历第一个集合的每个元素,在第二个集合中查找是否存在。如果存在,则将该元素添加到结果集合中。 #### 并集(Union) 上述代码中的`Append`函数实际上已经实现了简单的并集操作。...

    java8 集合求差集、并集、交集的实例

    下面小编就为大家分享一篇java8 集合求差集、并集、交集的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

    js取两个数组的交集|差集|并集|补集|去重示例代码|angluo-javascript-98592.pdf

    本篇将详细介绍如何使用JavaScript来获取两个数组的交集、差集、并集和补集,以及如何去除数组中的重复元素。这些操作在实际编程中非常实用,可以帮助我们有效地处理和分析数据。 首先,我们需要一个辅助方法`each`...

    delphi Memo及tstrlists的交集差集并集

    3. **并集(Union)**:将两个列表合并,去除重复项。 ```delphi var Combined: TStringList; begin Combined := TStringList.Create; List1.Union(List2, Combined); // Combined 现在包含了 List1 和 List2...

    顺序表表示集合,实现集合的交、并、差运算

    常见的集合运算包括交集(两个集合共有的元素构成的新集合)、并集(两个集合所有元素构成的新集合)以及差集(一个集合去除另一个集合中的元素后剩下的元素构成的新集合)。 ### 二、程序代码分析 #### 1. 数据...

    Python实现两个list求交集,并集,差集的方法示例

    主要介绍了Python实现两个list求交集,并集,差集的方法,结合实例形式分析了Python使用intersection、union及difference方法实现两个集合list的交集、并集与差集操作技巧,需要的朋友可以参考下

    python获得两个数组交集、并集、差集的方法

    本文实例讲述了python获得两个数组交集、并集、差集的房部分。分享给大家供大家参考。具体如下: 1. 获取两个list 的交集 #方法一: a=[2,3,4,5] b=[2,5,8] tmp = [val for val in a if val in b] print tmp #[2, 5]...

    基于python求两个列表的并集.交集.差集

    主要介绍了基于python求两个列表的并集.交集.差集,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    C#Linq获取两个List或数组的差集交集.pdf

    C# Linq 获取两个 List 或数组的差集交集 在实际开发中,我们经常遇到需要获取两个 List 或数组的差集交集问题,例如在树形选择节点中,需要根据之前选择的 ID 集合和新选择的 ID 集合来确定需要处理的 ID 集合。在...

    Python求两个list的差集、交集与并集的方法

    本文实例讲述了Python求两个list的差集、交集与并集的方法。分享给大家供大家参考。具体如下: list就是指两个数组之间的差集,交集,并集了,这个小学数学时就学过的东西,下面就以实例形式对此加以分析。 一.两个...

    List求差集

    在C#编程语言中,处理集合操作是常见的任务之一,比如求两个集合的交集、并集、差集等。本篇文章将详细讲解如何利用C#的基础类库,特别是`List&lt;T&gt;`类来实现求差集的操作,无需手动编写复杂的算法。 首先,差集的...

    c# linq的差集,并集,交集,去重代码(分享)

    如下所示: using System.Linq; List&lt;string&gt; ListA = new List(); List&lt;string&gt; ListB = new List(); List&lt;string&gt; ListResult = new List();...//差集 ListResult= ListA.Union(ListB).ToList(); //并集 ListResul

    Python中list的交、并、差集获取方法示例

    1. 获取两个list 的交集 # -*- coding=utf-8 -*- #方法一: a=[2,3,4,5] b=[2,5,8] tmp = [val for val in a if val in b] print tmp #[2, 5] #方法二 print list(set(a).intersection(set(b))) 2. 获取两个list 的...

    C++语言交并差集合运算

    根据给定的文件信息,本文将详细介绍C++语言中如何实现集合的基本运算——交集、并集和差集。此代码示例展示了如何利用链表结构来存储集合,并通过具体的函数实现了这些运算。 ### 一、集合的概念及运算 #### 1. ...

Global site tag (gtag.js) - Google Analytics