例如,
class App{
int k;
public App(int k)
{
this.k = k;
}
}
主要代码在这里:
App one = new App(2);
App Two = new App(3);
PriorityQueue<App> p = new PriorityQueue<>(2,new Comparator<App>() {
@Override
public int compare(App o1, App o2) {
if(o1.k < o2.k) return -1;
return 1;
}
});
p.add(two);
p.add(one);
显然,其中一个位于队列的最前面。 (p.peek().k 为 2)
但是,之后:
one.k = 9;
two.k = 8;
这个仍然排在队列的最前面(p.peek.k 是 9)!优先级队列的值改变后无法自动排序。
有没有一种方法可以在队列的值发生变化时对队列进行排序?
希望有人能帮忙。
最佳答案
PriorityQueue
和其他使用可比元素的集合(例如 TreeSet
)不适用于可变对象。它们仅在元素的顺序不变的情况下才起作用(要么因为您不以这种方式更改它们,要么它们是不可变的,因此根本无法改变)。
所以你不应该做什么。但如果您仍然这样做,PriorityQueue
不会提供重做排序的方法。
你的两个选择:
- 删除所有元素并重新添加
- 创建一个新的
PriorityQueue
,添加所有元素并使用它
顺便说一句,您的 Comparator
甚至不正确,如果 2 个值相等,它应该返回 0
。尝试使用 o1.k - o2.k
或 Integer.compare(o1.k, o2.k)
。
关于java - 优先级队列的值改变后无法自动排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25679191/