我正在尝试从另一个3d arraylist中删除一个2d arraylist。 我的意思是,从ar2 [] [] []删除所有ar1 [] [] 我无法理解为什么我的代码没有删除所有代码:
public void removeSame(ArrayList<ArrayList<String>> ar1,ArrayList<ArrayList<ArrayList<String>>> ar3)
{
for(int k=0;k<ar3.size();k++)
for(int j=0;j<ar3.size();j++)
if(isSame(ar1,ar3.get(k)))
{
ar3.remove(k);
}
}
public boolean isSame(ArrayList<ArrayList<String>> ar1,ArrayList<ArrayList<String>> ar2)
{
for(int k=0;k<ar2.size();k++)
for(int j=0;j<ar2.size();j++)
if(!ar1.get(k).get(j).equals(ar2.get(k).get(j)))
return false;
return true;
}
答案 0 :(得分:2)
删除数组时,3d数组会缩小。下一次迭代会跳过一个元素。例如,如果你的数组有10个元素而你删除#5,那么下一个迭代将转到过去的#7但现在是#6。 #6现在在#5中,你跳过它。删除元素时减少k。
答案 1 :(得分:2)
ar1
中ar3
次出现多次时,我可以看到一个问题。首先使用ar1
从ar3
删除ar3.remove(k);
后,ar3
ArrayList的索引和大小会发生变化,即。大小和索引都减少了一个。现在,当您继续循环时,它会在您继续使用原始索引时跳过其间的一个元素。你的内部for
循环似乎也没必要。
有两种方法可以解决这个问题。
选项1:用户列表#theerator即
Iterator<ArrayList<ArrayList<String>>> iter = ar3.iterator();
while(iter.hasNext()){
if(isSame(ar1, iter.next())){
iter.remove();
}
}
选项2:删除后,将索引(即k
)减1,然后再继续。
for(int k=0;k<ar3.size();k++){
if(isSame(ar1,ar3.get(k))){
ar3.remove(k--);
}
}
答案 2 :(得分:0)
你需要的就是这个
while(ar3.remove(ar1)){};