2015-10-13 85 views
2

我試着運行for循環,但它不會運行,因爲allWords是空的。因此我添加了第一個if語句,所以allWorlds至少有一個項目,因此循環將運行。循環現在運行,但我得到:如何解決我的代碼錯誤'併發修改異常'

Exception in thread "main" java.util.ConcurrentModificationException 
at java.util.ArrayList$Itr.checkForComodification(Unknown Source) 
at java.util.ArrayList$Itr.next(Unknown Source) 

一些谷歌搜索告訴我,這是因爲我試圖改變ArrayList的,而其使用的(?)。我想知道是否有一個簡單的解決方案,或者如果我不得不重寫代碼。提前致謝。

代碼:

private void addWord(String word){ 

    if(allWords.isEmpty()){ //allWords defined above. 
     allWords.add(word); 
    } 

    for (String check : allWords){ 

     if (!check.equalsIgnoreCase(word)){ 
      allWords.add(word); 
     } 
     else if(check.equalsIgnoreCase(word)){ 
      System.out.println("This word is a duplicate."); 
     } 
     else{ 
      System.out.println("Something went wrong."); 
     } 
    } 
} 
+0

正如評論建議您[較早前的問題(http://stackoverflow.com/questions/ 33109742/check-through-arraylist-if-it-contains-a-string-if-it-doesnt-add-that-stri),如果你不想要的話,可以用'Set '代替'List'允許'allWords'中的重複項。 ['Set.add()'](https://docs.oracle.com/javase/7/docs/api/java/util/Set.html#add%28E%29)的返回值表明該集合已經包含了價值與否。 –

+0

聲明'SortedSet allWords = new TreeSet (String.CASE_INSENSITIVE_ORDER);'將您的方法減少到'if(!allWords.add(word)){System.out.println(「This word is a duplicate。」); }' –

回答

1

你通過項目在for循環步進 - 會發生什麼,當你添加了一些列表,而你這樣做? Java不知道如何處理,所以它拋出了ConcurrentModificationException異常。

解決方案?當您在for循環中使用它時,請勿混淆陣列。

一個解決方案(並且這不是唯一的解決方案)是創建第二個數組,以便在運行for循環時暫時添加要添加的項目,然後返回並添加這些項目,重做。

但是,我懷疑你的邏輯在上面的代碼片段中有錯誤。它被寫入的方式看起來應該多次添加word。我想你想要的是一個布爾標誌:

  • 設置一個標誌,false您啓動for循環
  • 之前如果你發現word,而你遍歷你的話的陣列,然後將其設置爲true並退出for循環
  • 一旦完成for循環,請檢查您的標誌;如果它是false,那麼添加你的單詞(因爲你沒有在數組中找到它)。

此外,if...else if...else是多餘的:equalsIgnoreCase只能返回truefalse,所以沒有第三種選擇和else將永遠不會被擊中。

1

您的ArrayList正在使用中,因爲您正在迭代它。我會建議你做的時間數據

所以基本上是這樣的第二列表:

List<String> tempList = new ArrayList<String>(); 
..... 
if (!check.equalsIgnoreCase(word)){ 
    tempList.add(word); 
} 
.....