Java 优先队列排序问题

Java 优先队列排序问题,java,Java,我有一个优先队列的车辆,其中有一项订购不正确。我想我的比例尺里有什么东西是不可靠的,但我一直没能找到 public class Vehicle implements Comparable<Vehicle> { private int id; private Calendar queueTime; private int type; private int size; } @Override public int compareTo(Vehicle vehicle) {

我有一个优先队列的车辆,其中有一项订购不正确。我想我的比例尺里有什么东西是不可靠的,但我一直没能找到

public class Vehicle implements Comparable<Vehicle> {

private int id;
private Calendar queueTime;
private int type;
private int size;
 }

@Override
public int compareTo(Vehicle vehicle) {
    if (this.getType() == vehicle.getType()) {
        if (this.getSize() == vehice.getSize()) {
            return (this.queueTime.compareTo(vehicle.queueTime));
        } else if (this.getSize().compareTo(vehicle.getSize()) > 0) {
            return -1;
        } else {
            return 1;
        }
    } else if (this.getType().compareTo(vehicle.getType()) > 0) {
        return -1;
    } else {
        return 1;
    }
}
但我得到的却是:

Queue is: [
Vehicle [id=3, queueTime=1396824774459], 
Vehicle [id=7, queueTime=1396824774459], 
Vehicle [id=8, queueTime=1396824774459], 
Vehicle [id=5, queueTime=1396824774459], 
Vehicle [id=1, queueTime=1396824774458], 
Vehicle [id=2, queueTime=1396824774459], 
Vehicle [id=4, queueTime=1396824774459], 
Vehicle [id=6, queueTime=1396824774459]]

您的队列和
compareTo
方法可能工作正常。请注意API对此的说明:

此类及其迭代器实现集合和迭代器接口的所有可选方法。方法Iterator()中提供的迭代器不保证以任何特定顺序遍历优先级队列的元素。如果需要有序遍历,请考虑使用数组。排序(pq.toAlayle())。


通过操作poll、remove、peek和element从队列中检索项目时,顺序很明显。

如何设置优先级?队列有它自己的优先级,与
比较
产生的优先级不同。@DavidWallace:我不同意。如果没有使用比较器,那么自然顺序实际上是用来确定优先级或顺序的?如果您不从PQ中删除项目,您将无法获得其订单。查看Javadoc。@DavidWallace不,它没有。PriorityQueue没有“自己的优先级”。它具有Comparator或Comparable提供的内容,period.True,但OP没有向我们展示队列是如何创建的。尽管如此,他们可能没有提供一个
比较器
——否则他们会在这里显示它。所以我收回我的话。这是重要的,这是一个很好的观点。如果这个东西被实现为一个堆,例如,在引擎盖下,那么是的,当你序列化它时,你可能会看到一些非常有趣的事情。(事实上,在优先级队列上维护完整排序对于任务来说通常效率很低)@DrLivingston它是作为堆实现的:参见Javadoc。我没有使用迭代器来获得结果……我意识到迭代器不会生成排序结果。我只是简单地打印整个队列的内容……System.out.println(currentQueue)。@Ci CiMillsThomson:是的,当然你在使用迭代器。集合用于打印结果的
toString()
方法在后台使用迭代器。还有一个原因是,生产代码永远不应该依赖于
toString()
的结果。
Queue is: [
Vehicle [id=3, queueTime=1396824774459], 
Vehicle [id=7, queueTime=1396824774459],  
Vehicle [id=5, queueTime=1396824774459], 
Vehicle [id=1, queueTime=1396824774458], 
Vehicle [id=8, queueTime=1396824774459], 
Vehicle [id=4, queueTime=1396824774459], 
Vehicle [id=2, queueTime=1396824774459], 
Vehicle [id=6, queueTime=1396824774459]]
Queue is: [
Vehicle [id=3, queueTime=1396824774459], 
Vehicle [id=7, queueTime=1396824774459], 
Vehicle [id=8, queueTime=1396824774459], 
Vehicle [id=5, queueTime=1396824774459], 
Vehicle [id=1, queueTime=1396824774458], 
Vehicle [id=2, queueTime=1396824774459], 
Vehicle [id=4, queueTime=1396824774459], 
Vehicle [id=6, queueTime=1396824774459]]