我有两个包含三个整数的ArrayList
对象。我想找到一种返回这两个列表中共同元素的方法。请问是否有任何想法可以实现这个功能?
Collection#retainAll()
}}。listA.retainAll(listB);
// listA now contains only the elements which are also contained in listB.
listA
的更改,那么你需要创建一个新的列表。List<Integer> common = new ArrayList<>(listA);
common.retainAll(listB);
// common now contains only the elements which are contained in listA and listB.
Stream#filter()
和 Collection#contains()
。List<Integer> common = listA.stream().filter(listB::contains).toList();
// common now contains only the elements which are contained in listA and listB.
它只是慢了至少两倍。
ArrayList
对象。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);
现在,l3
应该只包含 l1
和 l2
中共同的元素。
CONSOLE OUTPUT
l1 == [1, 2, 3]
l2 == [4, 2, 3]
l3 == [2, 3]
l2
中所做的更改。您可能想要说的是 List<Integer> l3 = new ArrayList<Integer>(l2);
。 - BalusC为什么要重复造轮子?使用Commons Collections:
CollectionUtils.intersection(java.util.Collection a, java.util.Collection b)
retainAll()
不同。因此,根据您如何处理问题,可能有一个是正确的,而另一个是错误的。 - demongolem使用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());
考虑两个列表 L1 和 L2
使用 Java8 我们可以轻松地找到它
L1.stream().filter(L2::contains).collect(Collectors.toList())
您可以使用"retainAll"方法获取两个列表之间的共同元素。该方法将从应用于的列表中删除所有不匹配的元素。
Ex.: list.retainAll(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);
输出:
[10, 13, 12, 11]
[10, 113, 112, 111]
list::[10]
list1::[10, 113, 112, 111]
注意:在对列表执行retainAll操作后,列表将包含列表和list1之间的公共元素。
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);
public <T> List<T> getIntersectOfCollections(Collection<T> first, Collection<T> second) {
return first.stream()
.filter(second::contains)
.collect(Collectors.toList());
}
// Create two collections:
LinkedList<String> listA = new LinkedList<String>();
ArrayList<String> listB = new ArrayList<String>();
// Add some elements to listA:
listA.add("A");
listA.add("B");
listA.add("C");
listA.add("D");
// Add some elements to listB:
listB.add("A");
listB.add("B");
listB.add("C");
// use
List<String> common = new ArrayList<String>(listA);
// use common.retainAll
common.retainAll(listB);
System.out.println("The common collection is : " + common);
List<Integer> commons = new ArrayList<Integer>();
for (Integer igr : group1) {
if (group2.contains(igr)) {
commons.add(igr);
}
}
System.out.println("Common elements are :: -");
for (Integer igr : commons) {
System.out.println(" "+igr);
}
commons
包含了共同元素。第二个 for 循环将它们打印到控制台上。我没有看到代码在哪里计算共同元素的数量。 - Ajoy Bhatia
Collection#retainAll()
的链接和代码片段的注释中所回答的那样,不会。更改将反映在您调用该方法的列表中。 - BalusCretainAll()
方法。 - demongolem