我有两个3整数的arrayLists。我想找到一种方法来返回两个列表的共同元素。有任何想法,我怎么能做到这一点?两个列表中的通用元素
回答
您可以使用与您的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);
System.out.println("l2 == "+l2);
,l3
应该有l1
和l2
之间唯一的共同元素。
CONSOLE OUTPUT
l1 == [1, 2, 3]
l2 == [4, 2, 3]
l3 == [2, 3]
l2 == [4, 2, 3]
listA.retainAll(listB);
// listA now contains only the elements which are also contained in listB.
如果你想避免这种变化正在影响在listA
,那么你需要创建一个新的。
List<Integer> common = new ArrayList<Integer>(listA);
common.retainAll(listB);
// common now contains only the elements which are contained in listA and listB.
RetainAll返回一个新的列表? 我试图将保留的输出存储到一个新列表中,例如: tempList.addAll(listA.retainAll(listB));但它不起作用 – zenitis 2011-05-09 22:53:57
正如在'Collection#retainAll()'后面的链接和代码片段中的注释所回答的那样,否则它不会。更改会反映在您调用方法的列表中。 – BalusC 2011-05-09 22:56:14
问题是,列表common是用大小3初始化的,然后尝试通过仅返回一个或两个元素来更改其大小。 我尝试你的建议,它会让我超出界限例外。 – zenitis 2011-05-09 23:05:15
为什么要重新发明轮子?使用Commons Collections:
CollectionUtils.intersection(java.util.Collection a, java.util.Collection b)
这是一个很好的解决方案,但是正如我上面提到的,它具有不同于重复元素上的'retainAll()'的行为。很可能一个是正确的,一个是不正确的,取决于你如何解决问题。 – demongolem 2016-03-18 17:47:11
如果你想自己做吧..
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);
}
请解释**为什么**这回答了这个问题。 – brasofilo 2013-04-09 17:44:32
OP正在寻求一种方法来寻找哪些元素是共同的,而不是有多少共同的元素。 – 2013-07-19 19:05:25
@BrendonDugan - 这就是代码所做的。 “commons”列表包含共同元素。第二个for-loop在控制台上打印它们。我没有看到代码在计算常见元素的位置。 – 2016-03-22 21:49:01
使用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());
包含看起来像是一个O(n)操作,它将被调用n次,除非编译器做了一些巧妙的事情。有谁知道上述情况是以线性还是二次方式运行? – Regorsmitz 2016-08-12 20:56:49
这将是一个n * n操作! – 2017-11-23 11:13:41
// 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<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);
虽然此代码可能会回答问题,但提供有关* how *和/或* why *解决问题的其他上下文会提高答案的长期价值。 – 2016-07-20 22:11:42
- 1. 将元素一次添加到列表中的两个元素
- 2. 两个列表的元素相乘
- 3. 两个列表的比较元素
- 4. 两个列表元素的PMI
- 5. 如何显示两个列表中的两个元素?
- 6. 比较通用列表中的元素
- 7. 两个不在Python中使用集合的列表之间的通用元素
- 8. 如何将两个列表作为两个元素放入一个列表中?
- 9. 比较两个列表元素与LINQ
- 10. 保存元素为两个列表
- 11. 从通用列表中删除元素
- 12. python3.2)在列表中追加两个元素(列表中的列表)
- 13. 比较两个列表,并返回在两个列表的第一个元素
- 14. 使用LINQ从两个列表中选择不同的元素?
- 15. 总结列表中的用户跳过了前两个元素
- 16. 将函数应用于列表中的下两个元素
- 17. 列出出现在两个列表中的元素?
- 18. 在Python中从两个元组列表中选择元组,如果两个列表都包含公共元素
- 19. 选择发生在两个列表中的单个元素
- 20. 如何找到两个其他列表中的每个元素?
- 21. 序言:两个列表的元素总和与第三个列表中的元素相比
- 22. 比较两个列表中的元素并返回第三个列表元素的差异
- 23. 使用两个列表来比较元素并在这两个列表中创建一个非相同元素的列表?
- 24. 将两个列表的相应元素合并到一个新列表中
- 25. 如何将两个列表的元素添加到一个列表中?
- 26. Python:用另一个元素替换列表中的元素
- 27. 找到两个标签之间的元素列表中的
- 28. 与cbind的两个列表中的mapply元素
- 29. 排序的两个列表中的元素与订单限制
- 30. 找到两个列表中的常见元素和不同元素java中的列表
请注意,这种方式的变化也反映在'l2'上。你可能打算说'列表 l3 =新的ArrayList (l2);'而不是。 –
BalusC
2011-05-09 22:46:29
@BalusC:对。感谢您指出了这一点。 – 2011-05-09 23:24:03
如果说l1有2个元素,而l2有3个相同的元素,问题会变得更加混乱。即使在l1中只包含两次,retainAll returns也会将该元素的3放入l3中。 – demongolem 2012-11-12 02:19:22