优先级队列在其值已更改时无法自动排序

时间:2014-09-05 05:34:06

标签: 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
        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)!!优先级队列在其值已更改时无法自动排序。

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

希望有人可以提供帮助。

1 个答案:

答案 0 :(得分:2)

PriorityQueue和其他使用可比元素的集合(例如TreeSet)不适用于可变对象。它们只有在元素的排序没有改变时才会起作用(因为你没有以这种方式改变它们,或者它们是不可变的,因此根本不能改变)。

所以你做什么,你不应该。但是如果你仍然这样做,PriorityQueue没有提供重做排序的方法。

你的两个选择:

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

在旁注中,Comparator甚至不正确,如果2个值相等,它应返回0。尝试使用o1.k - o2.kInteger.compare(o1.k, o2.k)