我有兩個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. pop()列表中的兩個元素
- 2. 兩個列表中的獨特元素
- 3. 比較兩個元組列表中元素之間的元素
- 4. 使用列表中的元素兩次
- 5. 將列表中的元素拆分爲兩個元素?
- 6. 將元素一次添加到列表中的兩個元素
- 7. 兩個列表元素的PMI
- 8. 兩個列表的比較元素
- 9. Python,匹配兩個列表的元素
- 10. 兩個列表的元素相乘
- 11. 通用列表中的重複元素
- 12. 比較通用列表中的元素
- 13. 如何顯示兩個列表中的兩個元素?
- 14. 兩個不在Python中使用集合的列表之間的通用元素
- 15. Matlab,找到兩個單元陣列的通用元素
- 16. 返回兩個列表中出現的元素列表--SML
- 17. 兩個列表之間的共同元素和保留兩個列表中元素的順序
- 18. 用另一個列表中的元素替換兩個項目列表中的所有元素
- 19. 如何將兩個列表作爲兩個元素放入一個列表中?
- 20. 兩個元素初始化列表
- 21. 兩個元素列表方案
- 22. 比較兩個列表元素與LINQ
- 23. Python列表 - True/False前兩個元素?
- 24. 從通用列表中刪除元素
- 25. Prolog - 在兩個列表中提取元素列表
- 26. python3.2)在列表中追加兩個元素(列表中的列表)
- 27. 總結列表中的用戶跳過了前兩個元素
- 28. 使用LINQ從兩個列表中選擇不同的元素?
- 29. 將函數應用於列表中的下兩個元素
- 30. 比較兩個列表,並返回在兩個列表的第一個元素
請注意,這種方式的變化也反映在'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