0

我有一个 java 代码,其中我有一个 ArrayList 并想从 arraylist 中删除元素。

   ArrayList <word> wordlist=new ArrayList<>();

   public void removeWord(String inputWord){    
        for(word z:wordlist){               
            if(z.getWord() == inputWord)
                wordlist.remove(inputWord);
            System.out.println("the word" +inputWord+ "is removed");
        }
        System.out.println(wordlist.size());
    }

问题是该元素没有从列表中删除。

4

4 回答 4

5

您不能使用 . 从您正在迭代的列表中删除元素enhanced for-loop。这显然有时会起作用,但并非总是如此,并且会抛出ConcurrentModificationException.

如果要在迭代时删除元素,则必须使用Iterator,它具有Iterator#remove可用于删除当前元素的方法。

请参阅本教程: - http://docs.oracle.com/javase/tutorial/collections/interfaces/collection.html了解如何使用iterators.

此外,正如其他人已经提到的,您应该使用Object#equals方法来比较字符串的内容。使用==您不比较内容,而是比较参考。

于 2012-10-27T08:26:12.080 回答
1

用于z.getWord().equals(inputWord)比较字符串,并阅读 Rohit 的答案!

于 2012-10-27T08:27:35.280 回答
0

在这种情况下,您需要添加“break”语句。

public void removeWord(String inputWord)
{
    for (Word z : wordlist) {
        if (z.getWord().equals(inputWord)) {
            wordlist.remove(z);
            System.out.println("the word" + inputWord + "is removed");
            break;
        }
    }
    System.out.println(wordlist.size());

}

您需要从列表中删除单词 obj,因为列表是为单词对象创建的。还为 if else 语句使用大括号,这是最佳代码实践。

于 2012-10-27T08:46:49.740 回答
0

原因?

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

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

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

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

所以你的循环与下面相同

for (Iterator<word> 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("the word" + inputWord + "is removed");
        }
    }
    System.out.println(wordlist.size());

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

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