如何在Java中迭代和更改优先级队列中每个项目的值
在java中,我想将优先级队列中每个元素的值递减1 这是我尝试的一些代码的示例:如何在Java中迭代和更改优先级队列中每个项目的值,java,priority-queue,Java,Priority Queue,在java中,我想将优先级队列中每个元素的值递减1 这是我尝试的一些代码的示例: // more code PriorityQueue<Integer> q = new PriorityQueue<Integer>(size, Collections.reverseOrder()); // code that adds items to q for (Integer item: q) { item--; } 但是,它似乎根本不会更改优先级队列项目。 如何修复
// more code
PriorityQueue<Integer> q = new PriorityQueue<Integer>(size, Collections.reverseOrder());
// code that adds items to q
for (Integer item: q) {
item--;
}
但是,它似乎根本不会更改优先级队列项目。
如何修复此代码,使其符合我的预期
谢谢 首先,您需要了解它为什么不改变item的值。原因是Integer是一个不可变的类,这意味着一旦给类实例分配了一个int值,它就不会改变。可以修改循环语句以创建具有递减值的新整数,也可以使用AtomicInteger类及其getAndDecrement方法。但是,后者有一些同步开销 使用代码示例更新 我将创建一个新的PriorityQueue,并对第一个队列进行如下迭代:
Queue<Integer> newQueue = new PriorityQueue<Integer>();
Iterator<Integer> itr = q.iterator();
while(itr.hasNext()){
Integer current = q.poll();
// do some processing with current
}
如您所见,我们仅使用迭代器对PriorityQueue进行迭代,处理完成后,只需将newQueue设置为旧变量,或在方法中执行所有操作并返回newQueue。在PriorityQueue中变异对象可能会导致不一致的行为。虽然没有明确说明这一点,但插入元素是一个Ologn操作,但在不实际删除的情况下获取队列顶端的peek或元素是一个常量时间: 实现说明:此实现为 排队和退队方法提供、轮询、删除和添加; removeObject和containsObject方法的线性时间;和 检索方法peek、element和size的固定时间
这似乎表明元素是按加法排序的,并希望保持相同的排序顺序。以影响比较的方式对队列中的对象进行变异似乎没有得到考虑。您必须了解PriorityQueue是如何工作的
public PriorityQueue(int initialCapacity,
Comparator<? super E> comparator)
并将其用作
PriorityQueue<PriorityItem > q = new PriorityQueue<PriorityItem >(20, new Comparator<PriorityItem>() {
@Override
public int compare(PriorityItem one, PriorityItem two) {
// TODO Auto-generated method stub
return one.compareTo(two);
}
您只需创建另一个队列并通过添加第一个队列的递减值来填充它:
PriorityQueue<Integer> q = new PriorityQueue<Integer>(size, Collections.reverseOrder());
PriorityQueue<Integer> q2 = new PriorityQueue<Integer>(size, Collections.reverseOrder());
// code that adds items to q
for (Integer item: q) {
q2.add(--item);
}
我想我明白为什么它现在不起作用了,但不知道如何修复它。如何修改循环语句使其工作?我很想写这样的东西:煎饼=新的整数煎饼-1;但这和我以前写的一样。
PriorityQueue<PriorityItem > q = new PriorityQueue<PriorityItem >(20, new Comparator<PriorityItem>() {
@Override
public int compare(PriorityItem one, PriorityItem two) {
// TODO Auto-generated method stub
return one.compareTo(two);
}
for (PriorityItem item: q) {
item.setPriority(item.getPriority() + 1);
}
PriorityQueue<Integer> q = new PriorityQueue<Integer>(size, Collections.reverseOrder());
PriorityQueue<Integer> q2 = new PriorityQueue<Integer>(size, Collections.reverseOrder());
// code that adds items to q
for (Integer item: q) {
q2.add(--item);
}