Java自然排序

Java自然排序,java,Java,我试图使用priorityqueue,我假设元素是按“自然顺序”添加的 当我打印元素时,它不是按排序的顺序。我希望结果是-1,2,3,4 package scratch; import java.util.*; public class test { public static void main(String[] args) { PriorityQueue<String> pq = new PriorityQueue<String>();

我试图使用priorityqueue,我假设元素是按“自然顺序”添加的

当我打印元素时,它不是按排序的顺序。我希望结果是-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);*/
    }

}
包装划痕;
导入java.util.*;
公开课考试{
公共静态void main(字符串[]args){
PriorityQueue pq=新的PriorityQueue();
pq.添加(“2”);
pq.添加(“4”);
System.out.println(pq.peek()+);
资格预审报价(“1”);
pq.添加(“3”);
系统输出打印项次(pq);
/*System.out.println(pq.poll()+);
系统输出打印项次(pq)*/
}
}
输出:

二,
[1,3,2,4]

优先级队列的字符串表示形式并不反映其中元素的顺序,它完全基于队列的迭代顺序(这是
抽象集合中定义
toString()
的方式,
优先级队列
也使用此实现). 从链接的文档中:

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

中提供的迭代器 方法迭代器()不能保证遍历 任何特定顺序的优先级队列。如果需要有序遍历, 考虑使用数组。排序(pq.toAlayle())。

因为您使用的是在
AbstractCollection
中定义的
toString()

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(' ');
        }
    }
公共字符串toString(){
迭代器it=迭代器();
如果(!it.hasNext())
返回“[]”;
StringBuilder sb=新的StringBuilder();
某人附加(“[”);
对于(;;){
E=it.next();
附加(e==这个?”(这个集合):e);
如果(!it.hasNext())
返回sb.append(']').toString();
某人附加(‘,’)。附加(‘’);
}
}

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

方法Iterator()中提供的迭代器不保证以任何特定顺序遍历优先级队列的元素。如果需要有序遍历,请考虑使用数组。排序(pq.toAlayle())。

PriorityQueue
AbstractCollection
继承
toString()
方法,如源代码所示: 使用迭代器构造
字符串

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(", ");
        }
    }
印刷品

1 2 3 4 

此类及其迭代器实现集合和迭代器接口的所有可选方法。方法Iterator()中提供的迭代器不保证以任何特定顺序遍历优先级队列的元素。如果您需要有序遍历,请考虑使用数组。排序(pq.toAlayAy)(.q/to>)>可能的副本,但这并不能解释为什么<代码> toStrug()/<代码>按它的方式工作。毕竟,OP在代码中的任何地方都没有直接使用迭代器。
1 2 3 4