3

我正在尝试使用优先级队列,并且我假设元素是按“自然顺序”添加的。

当我打印元素时,它没有按排序顺序..我期望结果 - 1,2,3,4

package scratch;
import java.util.*;

public class test {
    public static void main(String[] args) {
        PriorityQueue<String> pq = new PriorityQueue<String>();
        pq.add("2");
        pq.add("4");
        System.out.println(pq.peek()+" ");
        pq.offer("1");
        pq.add("3");
        System.out.println(pq);
        /*System.out.println(pq.poll() + " ");
        System.out.println(pq);*/
    }

}

输出:

2 [1, 3, 2, 4]

4

3 回答 3

4

a 的字符串表示PriorityQueue不反映其中元素的顺序,它仅基于队列的迭代顺序iterator()(这是toString()在 中定义的方式AbstractCollection,并且也PriorityQueue使用此实现)。从链接的文档中:

迭代器不会以任何特定顺序返回元素。

于 2013-09-04T16:25:23.873 回答
4

优先队列

方法 iterator() 中提供的 Iterator 不能保证以任何特定顺序遍历优先级队列的元素。如果您需要有序遍历,请考虑使用 Arrays.sort(pq.toArray())。

并且因为您使用toString()的是在中定义的,AbstractCollection并且正如您所看到的iterator那样,因此无法保证顺序。

public String toString() {
        Iterator<E> it = iterator();
        if (! it.hasNext())
            return "[]";

        StringBuilder sb = new StringBuilder();
        sb.append('[');
        for (;;) {
            E e = it.next();
            sb.append(e == this ? "(this Collection)" : e);
            if (! it.hasNext())
                return sb.append(']').toString();
            sb.append(',').append(' ');
        }
    }
于 2013-09-04T16:25:32.187 回答
3

在 Java 中,PriorityQueue仅保证删除(获取)元素是特定顺序的。使用迭代器浏览内部结构可以是任何顺序。

方法 iterator() 中提供的 Iterator 不能保证以任何特定顺序遍历优先级队列的元素。如果您需要有序遍历,请考虑使用 Arrays.sort(pq.toArray())。

PriorityQueue继承toString()方法 from AbstractCollection,如源代码所示:http: //grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/AbstractCollection.java#AbstractCollection .toString%28%29 使用迭代器构造String

public String toString() {
        Iterator<E> i = iterator();
        if (! i.hasNext())
            return "[]";

        StringBuilder sb = new StringBuilder();
        sb.append('[');
        for (;;) {
            E e = i.next();
            sb.append(e == this ? "(this Collection)" : e);
            if (! i.hasNext())
                return sb.append(']').toString();
            sb.append(", ");
        }
    }

因此,要按排序顺序获取数据,您必须将它们从容器中删除(或使用其他方法对它们进行排序):

while (!pq.isEmpty()) System.out.print( pq.poll()+" ");

印刷

1 2 3 4 
于 2013-09-04T16:27:57.497 回答