我正在尝试使用优先级,我假设这些元素是以“自然顺序”添加的。
当我打印元素时,它不按排序顺序..我希望结果为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]
答案 0 :(得分:4)
PriorityQueue
的字符串表示并未反映其中元素顺序的任何内容,它仅基于队列iterator()
的迭代顺序(这就是toString()
的方式在AbstractCollection
中定义,PriorityQueue
也使用此实现。来自链接文档:
迭代器不会以任何特定顺序返回元素。
答案 1 :(得分:4)
提供的迭代器 方法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(' ');
}
}
答案 2 :(得分:3)
在Java中,PriorityQueue
仅保证删除(获取)元素按特定顺序排列。使用迭代器浏览内部可以是任何顺序。
方法iterator()中提供的迭代器不保证以任何特定顺序遍历优先级队列的元素。如果需要有序遍历,请考虑使用Arrays.sort(pq.toArray())。
并且PriorityQueue
继承了toString()
中的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