2016-05-23 59 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。