Java 如何创建根据列表的自然顺序排序的PQ?

Java 如何创建根据列表的自然顺序排序的PQ?,java,collections,priority-queue,Java,Collections,Priority Queue,我的SSCE: public class ComparableItem implements Comparable<ComparableItem> { private final int itemNo; public ComparableItem(final int itemNo) { this.itemNo = itemNo; } @Override public int compareTo(ComparableItem

我的SSCE:

public class ComparableItem implements Comparable<ComparableItem> {

    private final int itemNo;

    public ComparableItem(final int itemNo) {
        this.itemNo = itemNo;
    }

    @Override
    public int compareTo(ComparableItem o) {
        if (this.itemNo < o.itemNo) {
            return -1;
        } else if (this.itemNo > o.itemNo) {
            return 1;
        }
        return 0;
    }
}
public类compariableItem实现了compariable{
私人最终int项目编号;
公共可比项目(最终国际项目编号){
this.itemNo=itemNo;
}
@凌驾
公共国际比较(可比项目o){
如果(此.itemNoo.itemNo){
返回1;
}
返回0;
}
}
这里有一个测试来演示这个问题。创建PQ后,代码中断。以上几行是为了证明由compareTo(..)定义的自然顺序按预期工作。 打印PQ的元素:14,9,15,5,6,3与预期的15,14,9,6,5,3。有人能给我解释一下为什么会这样吗

import org.junit.Test;
import java.util.*;
import static org.junit.Assert.*;

public class CompTest{

@Test
public void aTest() {

    Integer[] order = {9, 3, 14, 15, 6, 5};
    List<ComparableItem> items = new ArrayList<ComparableItem>(order.length);
    for (int i = 0; i < order.length; i++) {
        items.add(new ComparableItem(order[i]));
    }

    List<ComparableItem> greater = new ArrayList<ComparableItem>();
    testCompare(items, items.get(3), greater, true);
    testCompare(items, items.get(2), greater, true);
    testCompare(items, items.get(0), greater, true);
    testCompare(items, items.get(4), greater, true);
    testCompare(items, items.get(5), greater, true);
    testCompare(items, items.get(1), greater, true);

    final PriorityQueue<ComparableItem> itemsQueue = new PriorityQueue<ComparableItem>(items);
    greater = new ArrayList<ComparableItem>();
    for (ComparableItem c : itemsQueue) {
        testCompare(itemsQueue, c, greater, false);
    }
}

public static void testCompare(final Collection<ComparableItem> items, final ComparableItem item, final List<ComparableItem> greater, boolean bigger) {
    final int exp = (bigger)? -1:1;
    for (ComparableItem c : items) {
        final int expected = c.equals(item) ? 0 : greater.contains(c) ? exp : exp*-1;
        assertEquals(expected, item.compareTo(c));
        assertEquals(expected * -1, c.compareTo(item));
    }
    greater.add(item);
}
import org.junit.Test;
导入java.util.*;
导入静态org.junit.Assert.*;
公共类CompTest{
@试验
公共无效测试(){
整数[]顺序={9,3,14,15,6,5};
列表项=新的ArrayList(order.length);
for(int i=0;i
}

newpriorityqueue(项目);
创建一个PriorityQueue,其中包含 指定集合中的元素。 如果指定的集合是 SortedSet的实例或是另一个实例 优先级队列,此优先级队列 将按照相同的标准订购 订购。否则,这是一个优先事项 队列将根据 元素的自然顺序


我认为问题不在队列中,而是在您测试它的方式中。特别是,javadoc适用于以下州:

返回此队列中元素的迭代器。迭代器不会以任何特定顺序返回元素

javadoc类说:

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


你是对的。这使测试运行:while(!itemsQueue.isEmpty()){ComparableItem c=itemsQueue.poll();testCompare(itemsQueue,c,greater,false);}
new PriorityQueue<ComparableItem>(items);