2013-03-16 58 views
0

我試圖按開始時間排序時間跨度列表(用Time []數組表示開始時間和結束時間)。我嘗試使用下面的嵌套循環可以這樣做:ConcurrentModificationException?

  for (Time[] span : workingList){ 
      Time[] compareTo = workingList.get(0); 

       for (Time[] inSpan : workingList){ 
        if (inSpan[0].before(compareTo[0])){ 
        compareTo = inSpan; 
        } 
       } 
      workingList.remove(compareTo); 
      toReturn.add(compareTo); 
     } 

    } 

但在該行for (Time[] span : workingList)(一個在頂部)拋出一個java.util.ConcurrentModificationException。我以前從未見過這個例外,有人可以向我解釋它的含義和原因。

我也接受更好的算法建議。

+0

供將來參考:當您有關於例外的問題時,您可以隨時查閱文檔。如果你谷歌「_Java 7 ConcurrentModificationException_」,第一個結果會帶你到文檔。如果您閱讀該頁面頂部的概述,它將解釋這種確切的情況。 – jahroy 2013-03-16 01:15:30

回答

6
workingList.remove(compareTo); 

您正在修改集合,同時對其進行迭代。

你應該使用類似:

ListIterator<Time[]> it = workingList.listIterator(); 

while (it.hasNext()) { 
    Time[] time = it.next(); 
    .. 
    it.remove(); 
} 

有辦法,也沒有使用列表迭代但這似乎更正確。

+0

另一種選擇是建立一個你想刪除的項目列表** WHILE **迭代,並刪除它們**在**迭代之後。 – jahroy 2013-03-16 01:12:53

+0

它主要取決於算法,在OP案例中,如果他正在刪除的元素並不總是與它正在迭代的元素相同,那麼構建臨時列表可能是唯一的選項。 – Jack 2013-03-16 01:14:40

1

我的建議是,您使用Collections.sort()訂購清單。它爲你做了排序,並使你能夠更清晰地理解你正在做的事情。你需要指定你自己Comparator調用方法時 - 這樣:

Collections.sort(workingList,new Comparator<Time[]>() { 
     @Override 
     public int compare(Time[] time1, Time[] time2) { 
      return time1[0].before(time2[0]); 
     } 
    }); 

這將排序workingList爲您的規格。

相關問題