从ar2 [] [] []中删除ar1 [] []

时间:2012-12-11 03:58:44

标签: java arraylist

我正在尝试从另一个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;
    }

3 个答案:

答案 0 :(得分:2)

删除数组时,3d数组会缩小。下一次迭代会跳过一个元素。例如,如果你的数组有10个元素而你删除#5,那么下一个迭代将转到过去的#7但现在是#6。 #6现在在#5中,你跳过它。删除元素时减少k。

答案 1 :(得分:2)

ar1ar3次出现多次时,我可以看到一个问题。首先使用ar1ar3删除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)){};