使用Java中的retainAll获取多个列表的交集

Mul*_*tut 6 java arraylist

我很难找到Java上几个列表的交集.我正在做的是:我得到(让我们说)3个整数列表:

清单1:[2,2,2,2,5,5]

清单2:[2,2,103]

清单3:[2,431]

我正在使用每个剩余列表将retainAll应用于第一个:

list1.retainAll(list2);
list1.retainAll(list3);
Run Code Online (Sandbox Code Playgroud)

我得到了这个结果:

list1:[2,2,2,2]

但我希望得到这个:

list1:[2]

...因为所有列表共享的唯一元素是一个 2而不是四个 2.

我知道这可能是retainAll函数的预期行为,但我需要得到上面提到的结果.

有帮助吗?

编辑: 使用HashSet禁止重复也不会有效.在这种情况下,例如:

清单1:[2,2,2,2,5,5]

清单2:[2,2,103]

清单3:[2,2,2,431]

我需要得到一个结果:

清单1:[2,2](因为所有列表至少有一对2)

代替

清单1:[2]

Mik*_*rov 6

这个方法怎么样:

public static <T> Collection <T> intersect (Collection <? extends T> a, Collection <? extends T> b)
{
    Collection <T> result = new ArrayList <T> ();

    for (T t: a)
    {
        if (b.remove (t)) result.add (t);
    }

    return result;
}

public static void main (String [] args)
{
    List <Integer> list1 = new ArrayList <Integer> (Arrays.<Integer>asList (2, 2, 2, 2, 5, 5));
    List <Integer> list2 = new ArrayList <Integer> (Arrays.<Integer>asList (2, 2, 103));
    List <Integer> list3 = new ArrayList <Integer> (Arrays.<Integer>asList (2, 431));

    System.out.println (intersect (list1, intersect (list2, list3)));
}
Run Code Online (Sandbox Code Playgroud)