提问者:小点点

简单的ArrayList.Remove(int)不起作用。 我做错了什么?


我试图迭代一个ArrayList,并在某些条件下(x==0)移除实际对象(索引s)。 如果执行,它总是在应该移除对象的行处给出错误。 没有remove(),它运行得非常好。

int s = 0;
int x = 0;
if (!objectList.isEmpty()) {
    for (obj actualObj : objectList) {
        if (x == 0) {
            objectList.remove(s);
        } else {
            System.out.println("x != 0");
        }
        s++;
    }
} else {
    System.out.println("list is empty");
}

共3个答案

匿名用户

我最大的挑剔是:当使用增强的for-each循环(for(tval:iterable<;T>))这样的语法糖时,您不能改变/修改您正在迭代的集合(除了调用iterator#remove等)。 事实上,iterator#remove的存在正是出于这个原因:

int toRemove = 0; //The number to remove from your list
List<Integer> list = /* your list */;
Iterator<Integer> itr = list.iterator(); //Create an iterator of the collection
while (itr.hasNext()) { //while new elements are available...
    Integer val = itr.next(); //grab the next available element
    if (val == toRemove) { //removal condition
        itr.remove(); //remove the last grabbed element from the collection
    }
}

如果你能使用Java 8:

int toRemove = 0; //The number to remove from your list
List<Integer> list = /* your list */;
list.removeIf(val -> toRemove == val); //didn't use member reference, for clarity reasons

匿名用户

您正在从列表中删除,同时遍历该列表。 一个可行的选项是

    int x = 0;
    List<String> objectList = Arrays.asList("A", "B", "C");
    if (objectList.isEmpty()) System.out.println("list is empty");

    List<String> filtered = objectList.stream().filter(s1 -> x != 0).collect(Collectors.toList());
    System.out.println(objectList + "\n" + filtered);

匿名用户

每次使用索引从列表中删除元素时,列表都会收缩,因为后面的元素会向左/向下移动一个位置。 这意味着在循环的下一次迭代中,您将实际删除一个紧挨着上一个删除元素的元素。

因此,应该使用迭代器而不是索引从循环中的列表中删除元素,如下所示:

Iterator<YourType> itr = objectList.iterator();
while (itr.hasNext()) {
    YourType obj = itr.next();
    if (some condition) {
        itr.remove();
    }
    // ...
}