从arraylist中删除对象

时间:2012-10-27 14:59:18

标签: java arraylist

我有一个名字,电话号码和位置的arraylist。

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

一旦我发现它,就像我在下面试过的那样,是否有移除物品?

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

由于

3 个答案:

答案 0 :(得分:2)

原因?

ArrayList返回的迭代器性质为fail-fast

  

此类的迭代器和listIterator方法返回的迭代器是fail-fas t:如果在创建迭代器之后的任何时候对列表进行结构修改,除非通过迭代器自己的删除或添加方法,迭代器将抛出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. The For-Each Loop
  2. ArrayList Java docs

答案 1 :(得分: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.remove方法而不是list.remove方法删除元素,因为这不会产生任何影响。

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

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

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

其余代码的工作原理相同。

答案 2 :(得分:0)

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

但是,你不能在for()循环内部迭代你正在修改的同一个集合。您将获得ConcurrentModificationException

请参阅"How to Avoid ConcurrentModificationException when using an Iterator"