我有两个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]
这是我的代码。
//returns a new IntSet after subtracting a from b
// .minus().toString()
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);
if(i == 0){
;
}
else if(j == 0){
;
}
else{
i = 0;
j = 0;
}
}
else{}
}
}
return minusArray;
我的代码在某些情况下能够工作,比如当 arrayList1 = [4,6]
和 arrayList2 = [6]
时,会得到一个结果为 [4]
的输出。但如果我尝试使用 [1,2,4]
和 [0,4,8]
这样的输入时,就会出现以下异常:
java.lang.IndexOutOfBoundsException: Index: 2, Size: 2
at java.util.ArrayList.rangeCheck(Unknown Source)
at java.util.ArrayList.get(Unknown Source)
at IntSet.minus(IntSet.java:119)
at IntSetDriver.main(IntSetDriver.java:62)
以下是我编写的代码。我已经对其进行了测试运行,我认为它应该可以工作。用户输入这些ArrayList,它们已经被预先排序了,我也不知道哈希或大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;
equals()
并删除了if true
,因此您可以像此答案建议的那样简单地使用removeAll()
:https://dev59.com/2Wkw5IYBdhLWcg3wY5jq#23172547。或者我有什么遗漏吗?如果您只想删除第一个出现,则可以使用Apache Utils或纯Java,就像这里建议的那样:https://dev59.com/2Wkw5IYBdhLWcg3wY5jq#49415419。否则,我建议以答案的形式提供您的解决方案,并解释为什么它是最佳的。将答案包含在问题中会破坏问答风格。 - jschnasse