2011-05-09 88 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

相关问题