例如,
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)!!优先级队列在其值已更改时无法自动排序。
是否有一种方法可以在更改值时对队列进行排序?
希望有人可以提供帮助。
答案 0 :(得分:2)
PriorityQueue
和其他使用可比元素的集合(例如TreeSet
)不适用于可变对象。它们只有在元素的排序没有改变时才会起作用(因为你没有以这种方式改变它们,或者它们是不可变的,因此根本不能改变)。
所以你做什么,你不应该。但是如果你仍然这样做,PriorityQueue
没有提供重做排序的方法。
你的两个选择:
PriorityQueue
,添加所有元素并使用在旁注中,Comparator
甚至不正确,如果2个值相等,它应返回0
。尝试使用o1.k - o2.k
或Integer.compare(o1.k, o2.k)
。