当前位置: 首页 > 知识库问答 >
问题:

Java中对象的优先级队列

姚凯歌
2023-03-14

我所拥有的是一个类,它创建了一个具有优先级、到达时间和完成时间的对象。我还有许多优先级队列可以将它们放入其中。当我开始时,我将它们放入到达队列中,对它们进行排序,然后查看哪个第一个进入,并将其放入队列中。但是,当我尝试向到达队列添加第二个队列时,它会失败并抛出一个异常。我首先要做的是将所有进程添加到到达队列中,然后对它们进行排序,这样到达时间最短的进程将是到达队列中第一个进入队列的进程。谢谢你帮忙

    //the comparator
    Comparator<Integer> comparator = new Comparator();
    //priority queues
    //only needs 10 elements to  hold
    PriorityQueue one = new PriorityQueue(10, comparator);
    PriorityQueue two = new PriorityQueue(10, comparator);
    PriorityQueue three = new PriorityQueue(10, comparator);
    PriorityQueue four = new PriorityQueue(10, comparator);
    PriorityQueue arrival = new PriorityQueue(10, comparator);

    //put all processes in arrival queue
    arrival.add(p1);
    arrival.add(p2);
    arrival.add(p3);
    arrival.add(p4);
    arrival.add(p5);
    arrival.add(p6);
    arrival.add(p7);
    arrival.add(p8);
    arrival.add(p9);
    arrival.add(p10);

共有1个答案

傅朝
2023-03-14

让我们看看您是如何定义comparator的,因为目前我认为您编写的内容甚至无法编译。

comparator是一个接口,这意味着您需要定义一个实现它的类。也就是说,您需要定义一个具有接口描述的方法的具体实现的类。这里,您只需要担心一个方法-compare。(接口还定义了equals,但这是一个奇怪的选择,因为它与object上的值相等,因此每个类默认情况下都将实现这个值……)

compare方法接受目标类型的两个对象,并决定其中哪一个“先于”另一个。它返回:

class MyComparator implements Comparator<MyClass> {

    public int compare(MyClass a, MyClass b) {
        // TODO
    }
}

我们知道,compare方法应该返回一个值,这取决于myclass参数中哪个在另一个之前。你在你的问题中说过,先来的是最小的(即最早的?)到达时间。

这实际上非常容易,因为这是java.util.date对象上所谓的自然排序--所以您可以直接比较它们的到达时间,因为比较的结果与整体比较的结果相同。

因此,compare的实现可以简单地(假设一个得名的访问器方法):

public int compare(MyClass a, MyClass b) {
    return a.getStartTime().compareTo(b.getStartTime());
}
Comparator<MyClass> comparator = new MyComparator();
PriorityQueue<MyClass> arrival = new PriorityQueue<MyClass>(10, comparator);
 类似资料:
  • 我需要一个优先级队列,它首先获得具有最高优先级值的项目。我当前正在使用队列库中的PriorityQueue类。但是,这个函数只先返回值最小的项。我尝试了一些很难看的解决方案,比如(sys.maxint-priority)作为优先级,但我只是想知道是否存在更优雅的解决方案。

  • 注意:我知道可以用比较器创建优先级队列,然后重复调用Add。

  • 我想知道,一旦对象被删除并重新插入队列以更新其优先级,是否无论如何都要保持优先级队列中对象的优先级? 我这样做的方法是从优先级队列中删除对象,并将更新后的对象再次放入队列中。然而,这将破坏我使用<code>比较器实现的自然排序 <代码>比较器 : 例如 按以下顺序插入:约翰、亚历克斯、科比、简 优先级队列的形式如下:[Jane,100],[Kerby,59],[Alex,33],[John,13]

  • 我试图实现Dijkstra算法的一个版本,以找到公共汽车从起点到终点的最短路线。不幸的是,我似乎找不到swift提供优先级队列类型的库或其他方式,所以我似乎必须自己编写代码。 话虽如此,有人能指出我做这件事的正确方向吗? 目前我的想法如下: 到目前为止这是我的代码。似乎太短太残忍了...我一定是在概念上漏掉了什么。

  • 我有一个,名为,其中包含类型的对象。 您可以在所有车辆上调用该方法。 我要做的是排序,这样车辆被赋予更高的优先级,并被放在队列的前面。 我假设我必须在这里使用一个比较器,但不知道怎么做。