【发布时间】:2014-11-18 22:56:45
【问题描述】:
我有一个优先队列,用于跟踪员工列表,并且它用于在开始时对它们进行排序的比较器按当前的“邀请值”对它们进行排序。所以我想选择最大邀请值员工,邀请他,然后重新选择下一个最大邀请值员工。棘手的部分是,在我邀请某个员工后,它会影响列表中其他一些员工的邀请值。我已经尝试了以下
PriorityQueue<Employee> leafs = new PriorityQueue<>();
//populating the queue happens here
while(!leafs.isEmpty()){
Employee maxLeaf = leafs.peek();
int maxValue = maxLeaf.getInviteValue();
maxLeaf.invite();
totalValue += maxValue;
k--;
for(Employee e : leafs){
if(e.invValueChanged){
leafs.remove(e);
leafs.add(e);
}
}
}
每位员工都会通过查看其 invValueChanged 字段来了解是否需要根据上次邀请重新计算其价值。这段代码给我一个优先队列错误
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.PriorityQueue$Itr.next(PriorityQueue.java:535)
【问题讨论】:
-
把它们全部拿出来。把它们全部放回去。
PriorityQueue没有排序。 -
@SotiriosDelimanolis 这将花费太长时间。我正在使用优先级队列来提高效率。有什么结构可以更好地解决这个问题吗?
-
那将花费太长时间这正是您当前正在做的事情,但是您做错了。您不能在结构上更改您正在迭代的数据结构。
标签: java priority-queue