从ArrayList中删除找到的第一个具有certificString的元素



我是一个完全的编码初学者。我已经在这个论坛上寻找这个问题的解决方案,但没有找到

现在我一直在编写removeFirstNote()方法。

每次我试图编译时,我都会收到一条错误消息,上面写着:

java.util.-ConcurrentModificationException

以下是我目前所掌握的。。。这需要通过FOR EACH循环(学校任务)来完成。

public class Notebook
{
    private ArrayList<String> notes;
    public Notebook()
    {
        notes = new ArrayList<String>();
    }
    public void removeFirstNote(String certainString)
    {   int noteNumber = 0;
        boolean removed = false;
        for (String note : notes){
            if(note.contains(certainString) && !removed){
                notes.remove(noteNumber);
                removed = true;
            } else {
                noteNumber++;
            }
        }   
    }

您面对的是ConcurrentModificationException,因为您一次要对同一个list执行两个操作。即同时循环和移除。

为了避免这种情况,请使用Iterator,它保证您可以安全地从列表中删除元素。

 Iterator<String> it = notes.iterator();
        while (it.hasNext()) {
            if (condition) {
                it.remove();
                break;
            }
        }

如果没有迭代器,

1) 你需要使用另一个列表

2) 将所有元素添加到其中。

3) 原始列表上的循环

3) 当条件满足时,来自原始listremove

第一次移除后仅break

    public void removeFirstNote(String certainString)
    {   
        int noteNumber = 0;
        //boolean removed = false; //No need
        for (String note : notes)
        {    
            if(note.contains(certainString))
            {
                notes.remove(noteNumber);
                //removed = true;
                break;
            } 
            else 
            {    
                noteNumber++;
            }
        }   
    }

你会很好奇为什么ConcurrentModificationException
为此,您应该知道for-each循环是如何工作的
List的for-each循环将通过迭代器内部转换为for循环。

for (Iterator<String> iterator = mylist.iterator(); iterator.hasNext();)

当您使用它,然后从列表中删除一个元素时,构造的Iterator将不知道任何关于该更改的信息,并且会有一个ConcurrentModificationException

您可以将其归结为以下内容:

public void removeFirstNote(String certainString) {
 for (String note: notes) {
  if (note.contains(certainString)) {
    notes.remove(note);
    break; // exit this loop.
  } 
 }
}

这是更有效的-一旦你找到了你想要的东西,迭代就没有意义了。

希望这能有所帮助。

Vinny Fleetwood

尝试:

for(String note : notes){
   if(!notes.contains(certainString){
      continue;
   }
   if(notes.contains(certainString)== true){
      System.out.println("String: " + certainString + " has been removed");
      notes.remove(certainString);
      break;
   }
   else{
     // do this
   }

不能在列表上循环并同时删除元素。如果你必须使用for循环,我建议你先循环列表,标记适合的项目,然后再删除它。

public void removeFirstNote(String certainString) {
  int noteNumber = 0;
  boolean removed = false;
  int index = -1;
  for (String note : notes) {
     if (note.contains(certainString) && !removed) {
        index = noteNumber;
        removed = true;
        //if your teacher allows you to, you can break the loop here and it all becomes easier
     } else {
        noteNumber++;
     }
  }
  if (index != -1) {
     notes.remove(index);
  }

}

相关内容

  • 没有找到相关文章

最新更新