java - 优先级队列的值改变后无法自动排序

标签 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)!优先级队列的值改变后无法自动排序。

有没有一种方法可以在队列的值发生变化时对队列进行排序?

希望有人能帮忙。

最佳答案

PriorityQueue 和其他使用可比元素的集合(例如 TreeSet)不适用于可变对象。它们仅在元素的顺序不变的情况下才起作用(要么因为您不以这种方式更改它们,要么它们是不可变的,因此根本无法改变)。

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

你的两个选择:

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

顺便说一句,您的 Comparator 甚至不正确,如果 2 个值相等,它应该返回 0。尝试使用 o1.k - o2.kInteger.compare(o1.k, o2.k)

关于java - 优先级队列的值改变后无法自动排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25679191/

相关文章:

java - 尝试编译基于 Maven 的应用程序时出错

java - AsyncTaks HTTP 请求超时和异常处理

java - 使用两个单例时如何避免递归?

c++ - std::swap of std::priority_queue with lambda comparator 在 C++20 但不是 C++17 下编译: "error: object of type value_compare cannot be assigned"

C++ STL 容器。为每个不同的实例参数化一个比较器

Java 表达式等价

sorting - 在 Google 表格中的过滤器 View 中排序时,ArrayFormula 列消失

javascript - 使用特殊字符 javaScript 对数组进行排序

c++ - 尝试使用运算符重载 C++ 按字母顺序对 Books vector 进行排序

c++ - 为什么 C++ 从队列中提取元素的性能这么差? (含比较)