Java 优先级队列的值更改后无法自动排序

Java 优先级队列的值更改后无法自动排序,java,sorting,priority-queue,Java,Sorting,Priority Queue,比如说, 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

比如说,

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是9)!!优先级队列的值更改后无法自动排序

是否有一种方法可以在队列值更改时对其进行排序


希望有人能提供帮助。

PriorityQueue
和其他使用类似元素的集合(例如
TreeSet
)不适用于可变对象。它们只有在元素的顺序没有改变的情况下才起作用(或者是因为你没有以那种方式改变它们,或者它们是不可变的,因此根本不能被改变)

所以你所做的,你不应该。但是,如果您仍然这样做,
PriorityQueue
不会提供重做订购的方法

您的两个选择:

  • 删除所有元素并再次添加它们
  • 创建一个新的
    PriorityQueue
    ,添加所有元素并使用它

另一方面,您的
比较器甚至不正确,如果两个值相等,它应该返回
0
。尝试使用
o1.k-o2.k
Integer.compare(o1.k,o2.k)

无法让集合知道您更改了其密钥。
one.k = 9; 
two.k = 8;