2011-05-09 57 views

回答

26

您可以使用與您的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應該有l1l2之間唯一的共同元素。

CONSOLE OUTPUT 
l1 == [1, 2, 3] 
l2 == [4, 2, 3] 
l3 == [2, 3] 
l2 == [4, 2, 3] 
+6

請注意,這種方式的變化也反映在'l2'上。你可能打算說'列表 l3 =新的ArrayList (l2);'而不是。 – BalusC 2011-05-09 22:46:29

+0

@BalusC:對。感謝您指出了這一點。 – 2011-05-09 23:24:03

+0

如果說l1有2個元素,而l2有3個相同的元素,問題會變得更加混亂。即使在l1中只包含兩次,retainAll returns也會將該元素的3放入l3中。 – demongolem 2012-11-12 02:19:22

105

使用Collection#retainAll()

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. 
+0

RetainAll返回一個新的列表? 我試圖將保留的輸出存儲到一個新列表中,例如: tempList.addAll(listA.retainAll(listB));但它不起作用 – zenitis 2011-05-09 22:53:57

+1

正如在'Collection#retainAll()'後面的鏈接和代碼片段中的註釋所回答的那樣,否則它不會。更改會反映在您調用方法的列表中。 – BalusC 2011-05-09 22:56:14

+0

問題是,列表common是用大小3初始化的,然後嘗試通過僅返回一個或兩個元素來更改其大小。 我嘗試你的建議,它會讓我超出界限例外。 – zenitis 2011-05-09 23:05:15

21

爲什麼要重新發明輪子?使用Commons Collections

CollectionUtils.intersection(java.util.Collection a, java.util.Collection b) 
+0

這是一個很好的解決方案,但是正如我上面提到的,它具有不同於重複元素上的​​'retainAll()'的行爲。很可能一個是正確的,一個是不正確的,取決於你如何解決問題。 – demongolem 2016-03-18 17:47:11

0

如果你想自己做吧..

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); 
} 
+2

請解釋**爲什麼**這回答了這個問題。 – brasofilo 2013-04-09 17:44:32

+1

OP正在尋求一種方法來尋找哪些元素是共同的,而不是有多少共同的元素。 – 2013-07-19 19:05:25

+0

@BrendonDugan - 這就是代碼所做的。 「commons」列表包含共同元素。第二個for-loop在控制檯上打印它們。我沒有看到代碼在計算常見元素的位置。 – 2016-03-22 21:49:01

9

使用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()); 
+3

包含看起來像是一個O(n)操作,它將被調用n次,除非編譯器做了一些巧妙的事情。有誰知道上述情況是以線性還是二次方式運行? – Regorsmitz 2016-08-12 20:56:49

+0

這將是一個n * n操作! – 2017-11-23 11:13:41

-1
// 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); 
2

enter image description here

  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); 
+0

雖然此代碼可能會回答問題,但提供有關* how *和/或* why *解決問題的其他上下文會提高答案的長期價值。 – 2016-07-20 22:11:42