66

我必须找到一种最佳方法来找出第二个数组列表中未显示的元素。认为

Arraylist a,b, 

Arraylist a={1,2,3,4,5};
Arraylist b={2,3,4};

所以基本上我想要的是找出数组列表 b中不存在的a元素。

那么最好的解决方案是什么?

4

10 回答 10

105
List<Integer> c = new ArrayList<>(a);
c.removeAll(b);

还可以考虑使用 Sets 而不是 Lists。

于 2012-11-08T09:24:51.903 回答
15

您可以使用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);
}

打印结果为:[1, 5]

Apache Commons 库经过充分测试,通常用于扩展标准 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);
}

打印的结果是一样的,[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);
}

结果是a其中不存在的所有元素b(即[1, 5]再次)。当然,顺序是不确定的,因为它是在集合上操作的。

于 2012-11-08T09:54:03.007 回答
14

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

a.stream().filter(b::contains).collect(Collectors.toList());
于 2018-01-10T21:00:46.387 回答
10

你可以试试removeAll

List<Integer> notPresent = new ArrayList<Integer>(a);
notPresent.removeAll(b);
于 2012-11-08T09:23:52.213 回答
9

采用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});

行动

List<Integer> c = ListUtils.removeAll(b, a)

结果在列表 c

4, 5
于 2016-08-30T09:29:35.330 回答
2

请尝试这样

for (Object o : a) {  
  if (!b.contains(o)) {  
    // this is not present
  }  
}  
于 2012-11-08T09:24:08.873 回答
1

遍历一个列表,然后使用contains检查其他列表中的每个元素是否。

于 2012-11-08T09:24:35.710 回答
1

像这样的东西。如果您认为其中可能存在重复,a您可以尝试另一种类型Collection,例如Setfor notPresent

   List<Integer> notPresent = new ArrayList<Integer>();

    for (Integer n : a){
     if (!b.contains(n)){
       notPresent.add(n);
     }
    }
于 2012-11-08T09:25:37.210 回答
1

试试这个:

 public static void main(String[] args) {
        List<Integer> a = new ArrayList<Integer>();
        List<Integer> b = new ArrayList<Integer>();
        List<Integer> exclusion = new ArrayList<Integer>();

        a.add(1);
        a.add(2);
        a.add(3);
        a.add(4);

        b.add(1);
        b.add(2);
        b.add(3);
        b.add(5);

        for (Integer x : a) {
            if (!b.contains(x)) {
                exclusion.add(x);
            }
        }

        for (Integer x : exclusion) {
            System.out.println(x);
        }

    }
于 2012-11-08T09:35:41.190 回答
0

试试这个...

使用contains()List的方法。

ArrayList<Integer> aList = new ArrayList<Integer>();

for (Integer i : a){

      if (!(b.contains(i))){

             aList.add(i);

       }

     else{
             continue;

      }

 }
于 2012-11-08T09:27:42.647 回答