0

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

3 回答 3

2

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

于 2012-12-11T04:06:29.657 回答
2

ar1当in出现不止一次时,我可以看到一个问题ar3ar1在第一次从ar3using中删除后ar3.remove(k);,ArrayList 的索引和大小ar3会发生变化,即。大小和索引都减一。现在,当您继续循环时,它将在您继续使用原始索引时跳过其间的一个元素。此外,您的内部for循环似乎是不必要的。

有两种方法可以解决该问题。

选项1:用户列表#iterator 即

Iterator<ArrayList<ArrayList<String>>> iter = ar3.iterator();
while(iter.hasNext()){
    if(isSame(ar1, iter.next())){
        iter.remove();
    }
}

选项2:删除后,将索引iek值减一,然后再继续,例如

    for(int k=0;k<ar3.size();k++){
       if(isSame(ar1,ar3.get(k))){
                ar3.remove(k--);
       }
    }
于 2012-12-11T04:07:06.007 回答
0

你只需要这个

while(ar3.remove(ar1)){};
于 2012-12-11T04:28:49.023 回答