我在民意调查时如何运作PriorityQueue?

时间:2016-11-04 15:51:55

标签: java priority-queue

我有一个名为Pair的预定义类,其中包含键和值。我根据每对的自然顺序将它们存储在PriorityQueue中。当我改变其中一个对的值然后出列时,我没想到会发生什么。测试代码如下。请帮忙。我感到困惑!

import java.util.*;
public class Test {
  static class Pair {
      int key;
      int value;
      Pair (int key, int value) {
        this.key = key;
        this.value = value;
      }
  }
  public static void main(String[] args) {
      PriorityQueue<Pair> pq = new PriorityQueue<Pair>(3, new Comparator<Pair>() {
        @Override
        public int compare(Pair p1, Pair p2) {
            return p1.value - p2.value;
        }
    });
    Pair p1 = new Pair(1, 31);
    Pair p2 = new Pair(2, 32);
    Pair p3 = new Pair(3, 33);
    pq.offer(p1);
    pq.offer(p2);
    pq.offer(p3);
    p2.value = 31;
    p1.value = 32;
    Pair p0 = pq.poll(); // It shows the reference p0 is p1 not expected p2. 
                        // And what remain in pq are p2 with 31 and p3 with 33
  }
}

我知道PriorityQueue会在轮询时对项目进行排序。看起来我的例子中的PriorityQueue不起作用。

1 个答案:

答案 0 :(得分:4)

当你有任何数据结构,如Hash Map / Set,TreeMap / Set或像PriorityQueue这样的排序队列时,如果你改变其中一个元素(特别是一个用于hashCode / equals / compareTo的字段,具体取决于具体的方法) (s)使用),数据结构不知道重新安排自己,而你正在做的是破坏数据结构,以便它不会按预期工作。

简而言之,您不能改变数据结构中对象的关键字段,并希望它以可靠的方式运行。