2

我有一个包含姓名、电话号码和位置的数组列表。

如果可能,我想从该数组中删除某些项目

一旦我像下面尝试过的那样找到它,有没有办法删除它?

public void delete(String nameToDelete) 
{    
    for (Entry entry : Directory.entries) { 
        if (entry.name.equalsIgnoreCase(nameToDelete))
        {
            //remove(entry);
        }
    }
}

谢谢

4

3 回答 3

2

原因?

ArrayList返回的迭代器本质上是fail-fast

这个类的迭代器和listIterator方法返回的迭代器是fail-fast:如果在迭代器创建后的任何时候列表在结构上被修改,除了通过迭代器自己的 remove 或 add 方法之外,迭代器将抛出一个ConcurrentModificationException. 因此,面对并发修改,迭代器快速而干净地失败,而不是在未来不确定的时间冒任意的、非确定性的行为。

当我不使用它时,这个迭代器从哪里来?

对于集合的增强 for 循环Iterator被使用,因此您在迭代时不能调用 remove 方法。

所以你的循环与下面相同

for (Iterator<Entry> i = c.iterator(); i.hasNext(); ){   

那么解决方案是什么?

iterator.remove();您可以基于迭代器显式而不是隐式调用和更改循环。

    String inputWord = "john";
    ArrayList<String> wordlist = new ArrayList<String>();
    wordlist.add("rambo");
    wordlist.add("john");
    for (ListIterator<String> iterator = wordlist.listIterator(); iterator
            .hasNext();) {
        String z = iterator.next();
        if (z.equals(inputWord)) {
            iterator.remove();
        }
    }
    System.out.println(wordlist.size());

现在我在哪里可以阅读更多内容?

  1. For-Each 循环
  2. 数组列表 Java 文档
于 2012-10-27T15:10:42.637 回答
1

您应该使用Iterator从列表中删除条目。如果您尝试在List通过增强的 for 循环迭代时修改您的,它可能会抛出ConcurrentModificationException,虽然这并不总是发生,但不能保证。

以下是您可以如何使用Iterator您的列表:-

Iterator<Entry> iterator = Directory.entries.iterator();

while (iterator.hasNext()) {
    Entry entry = iterator.next();

    if (entry.name.equalsIgnoreCase(nameToDelete)) {
        iterator.remove();
    }
}

即使在你应该使用方法而不是使用方法Iterator删除元素,因为这不会有什么不同。iterator.removelist.remove

您还可以使用ListIterator为您提供更多操作和方法来迭代列表。有关详细信息,请参阅文档。

要使用ListIterator,您可以像这样创建它:-

ListIterator<Entry> listIterator = Directory.entries.listIterator();

其余代码的工作方式相同。

于 2012-10-27T15:03:18.067 回答
0

您要做的是if entry.getKey().equals(nameToDelete)检查它是否是您想要的,然后使用该remove()方法删除该条目。

但是,您不能在for()遍历您正在修改的同一个集合的循环内执行此操作。你会得到一个ConcurrentModificationException

请参阅“使用迭代器时如何避免 ConcurrentModificationException”

于 2012-10-27T15:01:09.593 回答