Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/react-native/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从另一个arrayList中减去一个arrayList_Java - Fatal编程技术网

Java 从另一个arrayList中减去一个arrayList

Java 从另一个arrayList中减去一个arrayList,java,Java,我有两个arrayList,我正在尝试从另一个arrayList中“减去”一个arrayList。例如,如果我有一个arrayList[1,2,3],并且我试图减去[0,2,4],那么得到的arrayList应该是[1,3] List<Integer> a = new ArrayList<>(Arrays.asList(1, 2, 3)); List<Integer> b = Arrays.asList(0, 2, 4); subtract(a,b) // s

我有两个arrayList,我正在尝试从另一个arrayList中“减去”一个arrayList。例如,如果我有一个arrayList[1,2,3],并且我试图减去[0,2,4],那么得到的arrayList应该是[1,3]

List<Integer> a = new ArrayList<>(Arrays.asList(1, 2, 3));
List<Integer> b = Arrays.asList(0, 2, 4);
subtract(a,b) // should return [1,3]
这是我想出的代码。我已经做了测试运行通过它,对我来说,我认为它应该工作。用户输入这些arrayLists,然后对它们进行预排序,我也不知道Hash或big-O

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

    minusArray.addAll(array1);

    for(int i =0; i< minusArray.size(); i++){
        for(int j = 0; j < array2.size(); j++){
            if(minusArray.get(i).equals(array2.get(j))){
                minusArray.remove(i);
            }
            else{}
        }
    }

return minusArray;
ArrayList minusArray=new ArrayList();
minusArray.addAll(array1);
对于(int i=0;i
您的问题是在minusArray中。删除(…)调用可能会缩小minusArray的大小。要解决此问题,请从array.size()-1开始,然后向后计数到0


检查一下,即使这样也不能解决问题。您需要颠倒循环的顺序

尝试使用org.apache.commons.collections.CollectionUtils类的subtract方法

返回包含-b的新集合。返回集合中每个元素e的基数将是a中e的基数减去b中e的基数,或零,以较大者为准

CollectionUtils.subtract(java.util.Collection a, java.util.Collection b) 

我猜你会遇到范围问题,因为你已经消除了一个元素,它改变了内部循环所寻找的内容(我知道在处理普通列表和集合时会出现这个问题)


我过去必须做的是创建一个需要删除的项目列表(即在原始列表中找到的项目)。迭代新列表并直接删除原始列表的元素,而无需使用迭代器。使用索引遍历
minusArray
是一种方法,但我建议您使用
contains(Object)
方法,该方法允许您使用
remove(Object)
用于
array2
的特定元素


当然,总是有
removeAll(Collection)
可以完成您所需要的一切…

您可以使用org.apache.commons.collections.ListUtils,只需一行代码即可完成所有需要的内容=)


有什么原因不能简单地使用List.removeAll(List)吗

List one=new ArrayList();
一.加入第(1)款;
一.加入(2);
一.加入(3);
列表二=新的ArrayList();
二、加(0);
二、增加(2);
二、增加(4);
一、拆除全部(二);
系统输出打印项次(一);
结果:“[1,3]”
如果
removeAll()
不是您想要的,请尝试回答。e、 g.如果您对以下内容感兴趣

减去(a,b)

a
现在包含

[1, 3]
下面是关于如何实现减法的说明

“创建包含a的ArrayList,然后为b中的每个元素对其调用remove。”

行为像

要删除的差异所有()

爪哇8 您还可以使用流:

List<Integer> list1 =  Arrays.asList(1, 2, 3);
List<Integer> list2 =  Arrays.asList(1, 2, 4, 5);
List<Integer> diff = list1.stream()
                          .filter(e -> !list2.contains(e))
                          .collect (Collectors.toList()); // (3)

这将从第一个列表中减去第二个列表中的所有元素,并将结果放入新列表中。这不同于
列表。删除所有(集合)
,因为基数是受尊重的;如果列表1包含两次出现的
null
,而列表2仅包含一次出现,则返回的列表仍将包含一次出现。

我的参数化解决方案如下:

<T> ArrayList<T> subtract(ArrayList<T> alpha, ArrayList<T> beta) {
    ArrayList<T> gamma = new ArrayList<T>();
    alpha.forEach(n -> {if (!beta.contains(n)) gamma.add(n); });
    return gamma;
}
ArrayList减法(ArrayList alpha,ArrayList beta){
ArrayList gamma=新的ArrayList();
alpha.forEach(n->{if(!beta.contains(n))gamma.add(n);});
返回伽马;
}

@kukis CS 251将是某大学的二年级计算机科学课程。在java 8中,您可以执行
b.forEach((i)->a.remove(i))请参阅:以了解更多信息。
removeAll(2)
将删除所有出现的
2
,这不是通常定义减法的方式。通常仅在出现
2
时才删除。对的请参见OP未指定。但是,发布的代码似乎试图删除内部for{}循环中的所有内容。看来这就是目的?嗯,你说的对。它在所有元素上测试
remove()
。因此,这显然应该是公认的答案。我仍然会将我的答案留在这里以供进一步参考。>这显然应该是被接受的答案。请随时告诉OP。)这比
list1.removeAll(list2)
好多少?在我看来()这不是减法,因为它从列表1中删除了列表2中出现的所有值。还是我遗漏了什么?@jschnasse它返回两个列表之间的差,是的,它是减法。这里的目的是返回结果,而不是操纵原始列表。如果我们想从原始列表中删除,那么我们可以使用remove。因为您的代码在数组中的每个元素上测试
equals()
,如果为true则删除
。您只需使用此答案所建议的
removeAll()
。还是我遗漏了什么?如果您只想删除第一个实例,请使用apacheutils或纯java,如这里所建议的。否则,我建议以答案的形式提供您的解决方案,并解释为什么它是最好的。将答案包含在问题中打破了问答风格。Java 8:
    List<Integer> one = new ArrayList<Integer>();
    one.add(1);
    one.add(2);
    one.add(3);
    List<Integer> two = new ArrayList<Integer>();
    two.add(0);
    two.add(2);
    two.add(4);
    one.removeAll(two);
    System.out.println(one);

    result: "[1, 3]"
b.forEach((i)->a.remove(i));
[1, 3]
[1,2,2,3].removeAll([1,2,3]) //is empty
[1,2,3].forEach((i)->[1,2,2,3].remove(i)); //a is [2] 
List<Integer> list1 =  Arrays.asList(1, 2, 3);
List<Integer> list2 =  Arrays.asList(1, 2, 4, 5);
List<Integer> diff = list1.stream()
                          .filter(e -> !list2.contains(e))
                          .collect (Collectors.toList()); // (3)
ListUtils.subtract(list, list2)
<T> ArrayList<T> subtract(ArrayList<T> alpha, ArrayList<T> beta) {
    ArrayList<T> gamma = new ArrayList<T>();
    alpha.forEach(n -> {if (!beta.contains(n)) gamma.add(n); });
    return gamma;
}