Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java中迭代和更改优先级队列中每个项目的值_Java_Priority Queue - Fatal编程技术网

如何在Java中迭代和更改优先级队列中每个项目的值

如何在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--; } 但是,它似乎根本不会更改优先级队列项目。 如何修复

在java中,我想将优先级队列中每个元素的值递减1

这是我尝试的一些代码的示例:

// 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);
}