2

您好,我在优先级队列和比较器中有点迷失了。我真的不明白如何在java中制作比较器所以我所拥有的是给我一个错误,我所读到的对我没有帮助 http://www.tutorialspoint.com/java/java_using_comparator.htm 这个帖子游戏我一些想法,但我仍然坚持 如何去做我如何使用 PriorityQueue?

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

    //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);
4

1 回答 1

9

让我们看看你是如何定义的Comparator,因为目前我认为你所写的甚至不会编译。

Comparator是一个接口,意味着你需要定义一个实现它的类。也就是说,您需要定义一个类,该类具有接口描述的方法的具体实现。在这里,您只需要担心一种方法 - compare。(接口也定义了equals,但这是一个奇怪的选择,因为它等于 on Object,所以每个类都会默认实现它......)

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

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

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

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

你去吧!您刚刚定义了自己的比较器,它将MyClass按开始时间升序对对象进行排序。您可以在优先级队列中使用它,就像您已经拥有的一样:

Comparator<MyClass> comparator = new MyComparator();
PriorityQueue<MyClass> arrival = new PriorityQueue<MyClass>(10, comparator);
于 2012-10-16T14:58:17.540 回答