【问题标题】:PriorityQueue ordering issue [duplicate]PriorityQueue 排序问题[重复]
【发布时间】:2014-04-07 11:27:15
【问题描述】:

我有一个 PriorityQueue 的车辆,其中有一件物品订购不正确。我认为我的 compareTo 中有些东西很奇怪,但我一直没能找到它。

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;
    }
}

我有一个主类,它创建 PriorityQueue,创建一堆 Vehicle 对象,然后将它们添加到队列中。

Queue<Vehicle> currentQueue = new PriorityQueue<Vehicle>();
Vehicle smallPass1 = new Vehicle(1, Calendar.getInstance(), 1, 0);
Vehicle smallCargo1 = new Vehicle(2, Calendar.getInstance(), 0, 0);
Vehicle largePass1 = new Vehicle(3, Calendar.getInstance(), 1, 1);
Vehicle largeCargo1 = new Vehicle(4, Calendar.getInstance(), 0, 1);
Vehicle smallPass2 = new Vehicle(5, Calendar.getInstance(), 1, 0);
Vehicle smallCargo2 = new Vehicle(6, Calendar.getInstance(), 0, 0);
Vehicle largePass2 = new Vehicle(7, Calendar.getInstance(), 1, 1);
Vehicle largeCargo2 = new Vehicle(8, Calendar.getInstance(), 0, 1);

我期待这个输出:

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]]

【问题讨论】:

  • 如何设置优先级?队列有它自己的优先级,与compareTo 诱导的不同。
  • @DavidWallace:我不同意。如果没有使用 Comparator,则自然顺序 实际上用于确定优先级或顺序。
  • 你是怎么得到这个输出的?如果您不从 PQ 中删除项目,您将不会得到它的订单。请参阅 Javadoc。
  • @DavidWallace 不,它没有。 PriorityQueue 没有“自己的优先级”。它具有 Comparator 或 Comparable 所提供的内容。
  • 是的,但是 OP 没有向我们展示队列是如何创建的。不过,大概他们没有提供Comparator - 否则他们会在这里展示它。所以我收回我的言论。这个compareTo 很重要。

标签: java


【解决方案1】:

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

这个类及其迭代器实现了 Collection 和 Iterator 接口的所有可选方法。方法 iterator() 中提供的迭代器不保证以任何特定顺序遍历优先级队列的元素。如果需要有序遍历,可以考虑使用 Arrays.sort(pq.toArray())。

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

【讨论】:

  • 这很好。如果这个东西被实现为一个堆,例如,在引擎盖下,那么当你序列化它时你可能会看到一些非常有趣的东西。 (事实上​​,在优先级队列上维护一个完整的排序对于任务来说通常是非常低效的)
  • @DrLivingston 它被实现为一个堆:参见 Javadoc。
  • 我没有使用迭代器来获取结果...我意识到迭代器不会产生排序结果。我只是打印整个队列内容....System.out.println(currentQueue).
  • @Ci-CiMillsThomson:是的,当然你正在使用迭代器。您的集合用于打印其结果的toString() 方法在后台使用了一个迭代器。另一个原因是您永远不应该依赖 toString() 的结果来获取生产代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-13
  • 2021-03-08
  • 2020-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多