两个列表中的共同元素

zen*_*tis 91 java element arraylist

我有两个ArrayList对象,每个对象有三个整数.我想找到一种方法来返回两个列表的公共元素.有谁知道如何实现这一目标?

Bal*_*usC 151

使用Collection#retainAll().

listA.retainAll(listB);
// listA now contains only the elements which are also contained in listB.
Run Code Online (Sandbox Code Playgroud)

如果您想避免影响更改listA,则需要创建一个新的更改.

List<Integer> common = new ArrayList<Integer>(listA);
common.retainAll(listB);
// common now contains only the elements which are contained in listA and listB.
Run Code Online (Sandbox Code Playgroud)


Pab*_*ruz 35

您可以对ArrayList对象使用set intersection操作.

像这样的东西:

List<Integer> l1 = new ArrayList<Integer>();

l1.add(1);
l1.add(2);
l1.add(3);

List<Integer> l2= new ArrayList<Integer>();
l2.add(4);
l2.add(2);
l2.add(3);

System.out.println("l1 == "+l1);
System.out.println("l2 == "+l2);

List<Integer> l3 = new ArrayList<Integer>(l2);
l3.retainAll(l1);

    System.out.println("l3 == "+l3);
Run Code Online (Sandbox Code Playgroud)

现在,l3应该只有l1和之间的共同元素l2.

CONSOLE OUTPUT
l1 == [1, 2, 3]
l2 == [4, 2, 3]
l3 == [2, 3]
Run Code Online (Sandbox Code Playgroud)

  • 请注意,这种变化也反映在"l2"中.你可能想说`List <Integer> l3 = new ArrayList <Integer>(l2);`代替. (6认同)

小智 30

为什么重新发明轮子?使用Commons Collections:

CollectionUtils.intersection(java.util.Collection a, java.util.Collection b)
Run Code Online (Sandbox Code Playgroud)


Rob*_*sen 15

使用Java 8的Stream.filter()方法结合List.contains():

import static java.util.Arrays.asList;
import static java.util.stream.Collectors.toList;

/* ... */

List<Integer> list1 = asList(1, 2, 3, 4, 5);
List<Integer> list2 = asList(1, 3, 5, 7, 9);

List<Integer> common = list1.stream().filter(list2::contains).collect(toList());
Run Code Online (Sandbox Code Playgroud)

  • 包含它看起来像是一个O(n)操作,它将被调用n次,除非编译器做了一些聪明的事情.有谁知道上述是在线性还是二次时间运行? (4认同)
  • 读者注意:在 Java 16+ 中,替换 [`.collect( Collectors.toList() )`](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/ java/util/stream/Collectors.html#toList()) 与较短的 [`.toList()`](https://docs.oracle.com/en/java/javase/16/docs/api/java.base /java/util/stream/Stream.html#toList())(`Stream` 上的新方法)。 (2认同)

AVN*_*AVN 6

考虑两个列表 L1 和 L2

使用Java8我们可以很容易地找到它

L1.stream().filter(L2::contains).collect(Collectors.toList())


小智 5

在此处输入图片说明

List<String> lista =new ArrayList<String>();
List<String> listb =new ArrayList<String>();

lista.add("Isabella");
lista.add("Angelina");
lista.add("Pille");
lista.add("Hazem");

listb.add("Isabella");
listb.add("Angelina");
listb.add("Bianca");

// Create an aplusb list which will contain both list (list1 and list2) in which common element will occur twice 
List<String> listapluslistb =new ArrayList<String>(lista);    
listapluslistb.addAll(listb);
                
// Create an aunionb set which will contain both list (list1 and list2) in which common element will occur once
Set<String> listaunionlistb =new HashSet<String>(lista);
listaunionlistb.addAll(listb);
                
for(String s:listaunionlistb)
{
    listapluslistb.remove(s);
}
System.out.println(listapluslistb);
Run Code Online (Sandbox Code Playgroud)


小智 5

您可以使用“retainAll”方法获取两个列表之间的公共元素。此方法将从其应用的列表中删除所有不匹配的元素。

Ex.: list.retainAll(list1);
Run Code Online (Sandbox Code Playgroud)

在这种情况下,列表中不属于 list1 的所有元素都将被删除,仅保留 list 和 list1 之间共有的元素。

List<Integer> list = new ArrayList<>();
list.add(10);
list.add(13);
list.add(12);
list.add(11);

List<Integer> list1 = new ArrayList<>();
list1.add(10);
list1.add(113);
list1.add(112);
list1.add(111);
//before retainAll
System.out.println(list);
System.out.println(list1);
//applying retainAll on list
list.retainAll(list1);
//After retainAll
System.out.println("list::"+list);
System.out.println("list1::"+list1);
Run Code Online (Sandbox Code Playgroud)

输出:

[10, 13, 12, 11]
[10, 113, 112, 111]
list::[10]
list1::[10, 113, 112, 111]
Run Code Online (Sandbox Code Playgroud)

注意:在列表上应用retainAll后,列表包含list和list1之间的公共元素。


Raj*_*jan 5

List<Integer> listA = new ArrayList<>();
    listA.add(1);
    listA.add(5);
    listA.add(3);
    listA.add(4);   

List<Integer> listB = new ArrayList<>();
    listB.add(1);
    listB.add(5);
    listB.add(6);
    listB.add(7);
System.out.println(listA.stream().filter(listB::contains).collect(Collectors.toList()));


Java 1.8 Stream API Solutions
Run Code Online (Sandbox Code Playgroud)

输出[1,5]