2016-11-28 53 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