我有一个名为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不起作用。
答案 0 :(得分:4)
当你有任何数据结构,如Hash Map / Set,TreeMap / Set或像PriorityQueue这样的排序队列时,如果你改变其中一个元素(特别是一个用于hashCode / equals / compareTo的字段,具体取决于具体的方法) (s)使用),数据结构不知道重新安排自己,而你正在做的是破坏数据结构,以便它不会按预期工作。
简而言之,您不能改变数据结构中对象的关键字段,并希望它以可靠的方式运行。