找出另一个arraylist中没有的arraylist的元素

arv*_*unk 47 java arrays collections list arraylist

我必须找到一种最好的方法来找出第二个arraylist中没有出现的元素.假设

Arraylist a,b, 

Arraylist a={1,2,3,4,5};
Arraylist b={2,3,4};
Run Code Online (Sandbox Code Playgroud)

所以基本上我要的是找出的元素一个是不存在的ArrayList b.

那么这样做的最佳解决方案是什么?

Puc*_*uce 79

List<Integer> c = new ArrayList<>(a);
c.removeAll(b);
Run Code Online (Sandbox Code Playgroud)

还要考虑使用集而不是列表.

  • 小心!removeAll()使用equals()来比较元素.因此,您可能无法获得所需的行为. (7认同)

Nik*_*zov 10

你可以尝试removeAll:

List<Integer> notPresent = new ArrayList<Integer>(a);
notPresent.removeAll(b);
Run Code Online (Sandbox Code Playgroud)

  • - 使用泛型参数而不是原始类型 - removeAll返回布尔值而不是List (2认同)

Mag*_*lex 8

您可以使用Apache Commons Collections,它具有明确用于此目的的方法:

public static void main(String[] args) {
    List<Integer> a = Arrays.asList(new Integer[] { 1, 2, 3, 4, 5 });
    List<Integer> b = Arrays.asList(new Integer[] { 2, 3, 4 });
    Collection<Integer> aMinusB = CollectionUtils.subtract(a, b);
    System.out.println(aMinusB);
}
Run Code Online (Sandbox Code Playgroud)

打印结果为:[1,5].

Apache Commons lib经过了很好的测试,常用于扩展标准Java功能.此特定方法接受Iterable作为参数,因此您可以使用任何Collection您想要的.您还可以混合使用不同的集合类型:

public static void main(String[] args) {
    List<Integer> a = Arrays.asList(new Integer[] { 1, 2, 3, 4, 5 });
    Set<Integer> b = new HashSet<Integer>(Arrays.asList(new Integer[] { 2, 3, 4 }));
    Collection<Integer> aMinusB = CollectionUtils.subtract(a, b);
    System.out.println(aMinusB);
}
Run Code Online (Sandbox Code Playgroud)

打印结果相同,[1,5].

这里查看Javadoc .


为了完整起见,Google的Guava没有此功能:

Collection *subtract*(Collection, Collection)
没有等价物 - 创建一个包含a的ArrayList,然后为b中的每个元素调用remove.

但是,它实现了一个名为Sets.difference()method的方法,如果您更喜欢Guava并使用集合,则可以使用该方法:

public static void main(String[] args) {
    Set<Integer> a = new HashSet<Integer>(Arrays.asList(new Integer[] { 1, 2, 3, 4, 5 }));
    Set<Integer> b = new HashSet<Integer>(Arrays.asList(new Integer[] { 2, 3, 4 }));
    Set<Integer> aMinusB = Sets.difference(a, b);
    System.out.println(aMinusB);
}
Run Code Online (Sandbox Code Playgroud)

结果是所有元素a都不存在b(即[1,5]).当然,由于订单在集合上运行,因此订单不确定.


小智 8

这是使用Java 8的另一种方法-

a.stream().filter(b::contains).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

  • 这将找到a中存在于b中的所有项目,关于在a中查找项目的问题在b中不存在。 (13认同)
  • @Al-Mothafar `a.stream().filter(element -&gt; !b.contains(element)).collect(Collectors.toList());`... (7认同)
  • 如果更详细,我希望这个答案。例如,正如@NamHoang在另一个答案中所说,这将使用您的equals方法。除此之外,+ 1用于在一个旧问题中引入新概念。 (2认同)

mik*_*ika 6

使用 org.apache.commons.collections4.ListUtils

特定

List<Integer> a = Arrays.asList(new Integer[]{  1,2,3,4,5});
List<Integer> b = Arrays.asList(new Integer[]{0,1,2,3});
Run Code Online (Sandbox Code Playgroud)

行动

List<Integer> c = ListUtils.removeAll(b, a)
Run Code Online (Sandbox Code Playgroud)

结果列表c

4, 5
Run Code Online (Sandbox Code Playgroud)

  • 虽然你已经挖出了一个有四年之久的问题,但有趣的是将使用Apache ListUtils的解决方案与使用Apache CollectionUtils的Magnilex解决方案进行比较.虽然他们看起来做同样的事情,但他们的行为却略有不同 - 请参阅他们的文档. (2认同)