Java中对象的优先级队列

Java中对象的优先级队列,java,priority-queue,comparator,Java,Priority Queue,Comparator,你好,我在优先级队列和比较器中有点不知所措。 我真的不知道如何用java制作比较器 所以我犯了一个错误,我读到的对我没有帮助 这个赛后游戏让我有了一些想法,但我仍然坚持着怎么做 我有一个类,它创建了一个具有优先级、到达时间和完成时间的对象。 我也有许多优先队列来放置它们。当我开始时,我将它们放入到达队列,对它们进行排序,然后查看哪一个最先进入,并将其放入队列中。但是,当我尝试将第二个添加到到达队列时,它失败并引发异常。 我首先要做的是将所有进程添加到到达队列中,然后对它们进行排序,使到达时间最

你好,我在优先级队列和比较器中有点不知所措。 我真的不知道如何用java制作比较器 所以我犯了一个错误,我读到的对我没有帮助 这个赛后游戏让我有了一些想法,但我仍然坚持着怎么做

我有一个类,它创建了一个具有优先级、到达时间和完成时间的对象。 我也有许多优先队列来放置它们。当我开始时,我将它们放入到达队列,对它们进行排序,然后查看哪一个最先进入,并将其放入队列中。但是,当我尝试将第二个添加到到达队列时,它失败并引发异常。 我首先要做的是将所有进程添加到到达队列中,然后对它们进行排序,使到达时间最短的进程成为第一个离开到达队列并进入队列的进程。 谢谢你在这方面的帮助

    //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);
//比较器
比较器比较器=新比较器();
//优先级队列
//只需要10个元素就可以容纳
PriorityQueue one=新的PriorityQueue(10,比较器);
PriorityQueue 2=新的PriorityQueue(10,比较器);
PriorityQueue三=新的PriorityQueue(10,比较器);
优先级队列4=新的优先级队列(10,比较器);
PriorityQueue arrival=新的PriorityQueue(10,比较器);
//将所有进程放入到达队列
到达。添加(p1);
到达。添加(p2);
到达。添加(p3);
到达。添加(p4);
添加(p5);
到达。添加(p6);
到达。添加(第7页);
到达。添加(第8页);
到达。添加(第9页);
到达。添加(第10页);

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

Comparator
是一个接口,这意味着您需要定义一个实现它的类。也就是说,您需要定义一个类,该类具有接口所描述的方法的具体实现。在这里,您只需要担心一种方法——
compare
。(该接口还定义了
等于
,但这是一个奇怪的选择,因为它等于
对象
上的值,因此默认情况下每个类都将实现此选项…)

compare
方法获取目标类型的两个对象,并决定其中哪一个在另一个之前。它返回:

一个负整数、零或正整数作为 第一个参数小于、等于或大于 第二

所以-您想比较
p1
p2
实例的任何类的对象(我称之为
MyClass
)。这意味着您必须定义一个类:

class MyComparator implements Comparator<MyClass> {

    public int compare(MyClass a, MyClass b) {
        // TODO
    }
}
就这样!您刚刚定义了自己的比较器,它将按开始时间升序对
MyClass
对象进行排序。您可以在优先级队列中使用它,类似于您已经使用的:

Comparator<MyClass> comparator = new MyComparator();
PriorityQueue<MyClass> arrival = new PriorityQueue<MyClass>(10, comparator);
Comparator Comparator=new MyComparator();
PriorityQueue arrival=新的PriorityQueue(10,比较器);

“…它失败并引发异常。”哪一个,错误消息是什么?为什么需要多个优先级队列?如果你真的想按到达时间比较,为什么你的对象有“优先级”?您所说的“队列一”是什么意思?除了到达队列,您还有4个队列…?比较器通常是您必须实现的接口。我看不出您在哪里实现了这个接口。如果您看一下,您会发现他将comparator声明为int,这是我尝试执行的主要方法。@MNM-是的,Jon定义了一个实现了
comparator
(他的
StringLengthComparator
)的类,然后实例化了它。您还没有这样做,您正试图直接调用
new Comparator()
,这将无法编译,因为
java.util.Comparator
是一个接口。啊,谢谢,现在我看到了我的错误,但是比较部分有一个问题{返回a.getArrivalTime().compareTo(b.getArrivalTime();}这会给出一个错误int不能被取消引用这意味着什么?哦,您将开始时间存储为
int
s?这可能不是及时表示实例的最佳选择(如果没有其他选择,您应该编写一个包装器类以清晰地显示和放置方法),但很公平。在这种情况下,您需要比较两个int-为此使用
b.getStartTime()-a.getStartTime()
(这将从compareTo返回适当的答案)。要回答您的实际问题-“
int
不能被取消引用”意味着您不能调用
int
(或获取字段-通过使用点引用其中的内容来取消引用的任何内容)。只能取消引用对象,并且由于
int
是一个原语,它不是一个对象,因此没有字段/方法,无法取消引用。
Comparator<MyClass> comparator = new MyComparator();
PriorityQueue<MyClass> arrival = new PriorityQueue<MyClass>(10, comparator);