2012-10-16 214 views
0

Hello Im在优先级队列和比较器中丢失了一点。 我真的不看如何在Java的 比较所以我有什么是给我一个错误,我已阅读对我来说 http://www.tutorialspoint.com/java/java_using_comparator.htm 没有帮助本赛后我一些想法,但林仍然停留在如何做到这一点 How do I use a PriorityQueue?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); 
+1

“...它失败并引发异常。” **哪一个**,什么是错误信息? –

+1

为什么你需要多个优先级队列?为什么你的对象有一个“优先级”,如果你真的想通过到达时间比较它们?你的意思是“排队一” - 你到达队列之外有4个队列...? – DNA

+0

“比较器”通常是您必须实现的接口。我看不到你已经实现了这个接口。 –

回答

5

任何帮助,让我们来看看你是如何定义Comparator,因为此刻我不认为你写的,甚至会编译。

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

compare方法将目标类型的两个对象,并决定哪一个来自另一个“之前”。它返回:

负整数,零或正整数作为 第一个参数大于所述第二 小于,等于,或更大。

所以 - 要比较的任何对象类的p1p2实例是(我称之为MyClass)。这意味着,你必须定义一个类:

class MyComparator implements Comparator<MyClass> { 

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

我们知道,比较方法应根据其的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); 
+0

现在我知道我错了,但是比较部分有一个问题{return a.getArrivalTime()。compareTo(b.getArrivalTime()); }这给了一个错误int不能解除引用是什么意思? – MNM

+0

哦,你将开始时间存储为int?这可能不是用时间来表示一个实例的最佳选择(如果没有其他的你应该写一个包装类为了清晰和放置方法的地方),但足够公平。在这种情况下,您需要比较两个整数 - 对此使用'b.getStartTime() - a.getStartTime()'(它将从compareTo返回适当的答案)。 –

+0

要回答你的实际问题 - “'int'不能被解除引用”意味着你不能在int中调用方法(或者获取字段 -​​ 任何涉及* dereferencing *的东西,通过使用点来引用它里面的东西) 。只有对象可以被解引用,并且由于'int'是一个基元,它不是一个对象,所以没有字段/方法,也不能被解引用。 –