【问题标题】:Arraylist remove elements [closed]Arraylist 删除元素 [关闭]
【发布时间】:2012-10-17 09:38:06
【问题描述】:

我有一个 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());
    }

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

【问题讨论】:

  • 除了 Rohit 的回答之外,"==" sigh .equals

标签: java


【解决方案1】:

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

如果您想在迭代时移除元素,则必须使用Iterator,它有方法Iterator#remove,您可以使用该方法移除当前元素。

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

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

【讨论】:

  • 另请参阅ListIterator,了解更多在迭代期间更改列表的选项。 (见List.listIterator())。
  • 谢谢,因为我是java新手,我对Iterator了解不多,这意味着我必须实现Iterator并使用remove方法。但是我如何使用 remove 方法,我的意思是方法中的条件应该是什么?
  • @coolmego。请参阅我提供的教程链接。它解释了如何使用迭代器。
  • @coolmego。您可以使用Iterator#next 方法获取下一个元素。此外,正如邓肯所说,您可以更好地使用ListIterator。它有 ListIterator#next 方法,它为您提供了它正在迭代的列表中的下一个元素。
  • @coolmego。有关示例,另请参阅 thisthisthis 帖子。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    在这种情况下,您需要添加一个“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 语句也使用大括号,这是最佳代码实践。

    【讨论】:

      【解决方案4】:

      原因?

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

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

      这个迭代器在我不使用的时候是从哪里来的?

      对于集合 Iterator 的增强 for 循环被使用,因此您在迭代时不能调用 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. The For-Each Loop
      2. ArrayList Java docs

      【讨论】:

      • 非常感谢,真的用完了。
      猜你喜欢
      • 2012-04-25
      • 1970-01-01
      • 2023-03-07
      • 2013-02-24
      • 1970-01-01
      • 2016-07-23
      • 2014-08-28
      相关资源
      最近更新 更多