2016-05-23 95 views
4

所以基本上這是我的問題......我有2個結構LinkedList,和優先級闕(BinaryHeap)。遍歷列表,而從中刪除

LinkedList中充滿了我自己的對象,我想循環遍歷列表,如果滿足條件,請從列表中刪除並將其放回優先級隊列中。除了當我的條件是大小時,當我移除時,它會改變大小,因此從不檢查我的整個列表。

goodJobs是一個LinkedList。 jobList是我目前空的BinaryHeap。

的原始靈感:

for (int i = 0; i < goodJobs.size(); i++) { 
     if (((Job) goodJobs.get(i)).getArrivalTime() > time) { 
      jobList.insert((Comparable) goodJobs.remove(i)); 
     } 

    } 

這並沒有爲我上面提到的原因,工作,所以反而,我想用一個定點對象來檢測列表的末尾,而不是使用的大小列表。使用Java的迭代器...

ListIterator i; 

int k = 0; 
for (i = goodJobs.listIterator(); i.hasNext(); i.next()) { 

    if (((Job) goodJobs.get(k)).getArrivalTime() > time) { 
     jobList.insert((Comparable) goodJobs.remove(k)); 
    } 

    k++; 
} 

然後我很快了解到,雖然修改它(從它刪除),通過ConcurrentModificationException的,你不能從列表中刪除。

我不確定如何繞過這裏的十字路口。該方法的想法是,在BinaryHeap中,我有一堆對象,我想刪除那些有「ArrivalTime」(通過輸入文件指定),>程序當前時間的對象。

這裏是整個方法本身:

private LinkedList findCandidates() { 

    LinkedList goodJobs = new LinkedList(); 

    while (!jobList.isEmpty()) { 
     goodJobs.add(jobList.deleteMinimum()); 
    } 


    for (int i = 0; i < goodJobs.size(); i++) { 
     if (((Job) goodJobs.get(i)).getArrivalTime() > time) { 
      jobList.insert((Comparable) goodJobs.remove(i)); 
     } 

    } 


    return goodJobs; 
} 

回答

4

Iterator.remove()的Javadoc說(部分)

迭代器的行爲是不確定的,如果底層的集合被修改,迭代過程中除了通過調用這個方法以外。

你應該做的是得到Iterator並迭代(當滿足條件時調用remove())。類似的,

Iterator<Job> iter = goodJobs.iterator(); 
while (iter.hasNext()) { 
    Job j = iter.next(); 
    if (j.getArrivalTime() > time) { 
     jobList.insert(j); 
     iter.remove(); 
    } 
} 
0

建議嘗試使用CopyOnWriteArrayList而不是LinkedList。