优先队列未保持排序顺序

时间:2018-08-10 12:56:32

标签: java collections

优先级队列未保持排序顺序 我无法正确实施Comparable吗? 输出的排序顺序不正确?

import java.util.PriorityQueue;

    class A implements Comparable 
    {
        int i;
        A(int i)
        {
            this.i =  i;

        }
        public int compareTo(Object obj)
        {
            return i - ((A)obj).i;
        }
        public String toString()
        {
            return Integer.toString(i);
        }

    }
    class Manager11
    {
        public static void main(String[] args) 
        {
            PriorityQueue pq =  new PriorityQueue();
            pq.add(new A(9));
            pq.add(new A(5));
            pq.add(new A(8));
            pq.add(new A(19));
            pq.add(new A(1));

            System.out.println(pq);
        }
}

输出: [1、5、8、19、9]

3 个答案:

答案 0 :(得分:2)

在优先级队列中,唯一的保证就是 head 是最低的(或最大的,取决于您的比较)。内部结构不一定是排序列表。实际上,在Java中,这是一个堆:

  

PriorityQueue

     

基于优先级堆的无界优先级队列。

但是,如果循环执行poll()第一项,则一次又一次打印,直到优先级队列为空。元素应从最小到最大打印。

答案 1 :(得分:2)

Primary队列不能保证ordering。它使用的内部数据结构是Heap。但是无论何时轮询,它都会按其优先级顺序返回元素。例如下面的代码:

for (int i = 0; i < 5; i++) {
    System.out.print(pq.poll() + " ,");
}

为您提供输出:

1 ,5 ,8 ,9 ,19 

答案 2 :(得分:1)

您没有正确实现@echo off cd "C:\Users\C51539A\Downloads\influxdb-1.5.2-1" start "InfluxDB" cmd /c start.cmd ... :这是一个泛型类,因此您应该指定类型参数。我想你想要Comparable

Comparable<A>

这不会更改代码的输出,只会消除强制转换和警告。

此外,请勿使用减法比较整数,因为这不能处理溢出:请使用class A implements Comparable<A> { // ... @Override public int compare(A other) { return i - other.i; // Cast is no longer required. } // ... }

Integer.compare