- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
所以基本上这是我的问题...我有 2 个结构,一个 LinkedList 和一个 Priority Que(BinaryHeap)。
LinkedList里面全是我自己的对象,我想循环遍历这个链表,如果满足一个条件就从链表中移除,放回优先级队列中。除了当我的条件是大小时循环时,当我删除时,它会改变大小,因此永远不会检查我的整个列表。
goodJobs 是一个链表。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;
}
最佳答案
Iterator.remove()
Javadoc 说(部分)
The behavior of an iterator is unspecified if the underlying collection is modified while the iteration is in progress in any way other than by calling this method.
您应该做的是获取Iterator
并进行迭代(在满足您的条件时调用remove()
)。类似的东西,
Iterator<Job> iter = goodJobs.iterator();
while (iter.hasNext()) {
Job j = iter.next();
if (j.getArrivalTime() > time) {
jobList.insert(j);
iter.remove();
}
}
关于java - 遍历列表,同时从列表中删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37382010/
我是一名优秀的程序员,十分优秀!