我是一个完全的编码初学者。我已经在这个论坛上寻找这个问题的解决方案,但没有找到
现在我一直在编写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) 当条件满足时,来自原始list
的remove
第一次移除后仅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);
}
}