Java自然排序

时间:2013-09-04 16:21:19

标签: java

我正在尝试使用优先级,我假设这些元素是以“自然顺序”添加的。

当我打印元素时,它不按排序顺序..我希望结果为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]

3 个答案:

答案 0 :(得分:4)

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

  

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

答案 1 :(得分:4)

来自PriorityQueue

  

提供的迭代器   方法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