2016-11-28 72 views
0

我已经给了这个练习做,我很努力去理解为什么我编译我的代码时不断收到并发修改错误。并发修改异常,当我编译我的代码,

“如果列表中包含有相匹配的参数 标题标题薄膜,然后更新它的长度和类型。如果没有发现匹配创建 新的电影,并将其添加到列表中。”

我设法检查是否有匹配的标题,但是当没有一个我无法成功地添加一个新的电影到我的数组。这里是我写的代码:

public void updateLengthAndGenre(String title, int length, String genre) { 
    ArrayList<Film> output = new ArrayList<>(); 
    boolean found = false; 

    for (Film film : films) { 
     if (film.getTitle().equals(title)) { 
      found = true; 
      film.setGenre(genre); 
      film.setLength(length); 
     } 
    } 

    for (Film film : films) { 
     if (!found) { 
      films.add(new Film(title, length, genre)); 
     } 
    } 
} 

有人可以解释为什么我不断收到此错误,也给我一些建议如何补救它?

回答

2

你得到这个过错的原因是因为你试图在迭代它的同时添加到一个集合。你不可以做这个。就你而言,似乎你甚至不需要这样做。

public void updateLengthAndGenre(String title, int length, String genre) { 
    ArrayList<Film> output = new ArrayList<>(); 

    for (Film film : films) { 
     if (film.getTitle().equals(title)) { 
      film.setGenre(genre); 
      film.setLength(length); 
      return; 
     } 
    } 

    films.add(new Film(title, length, genre)); // synchronize if you're multithreading 
} 

这也有同样的效果。如果您在迭代过程中绝对需要添加到集合中,则可以使用java.util.ListIterator

ListIterator<Film> filmIter = films.listIterator(); 
while(filmIter.hasNext()){ 
    if(/* some condition */){ 
     fillmIter.add(new Film(title, length, genre)); 
    } 
    filmIter.next(); // example only. 
} 
+0

非常感谢你的两个建议工作。 – Peter