2013-03-18 56 views
0

我需要使用PriorityQueue来对FIFO元素进行排序。该队列将包含一个Message对象,其中每个对象将有一个double timestamp以及一个int counter,该对象跟踪该消息已收到多少确认。 有两种类型的消息 - 一种具有数据,另一种具有确认。只有带有数据的消息才会放入队列中。我正在编写一个比较器,用于对队列进行排序。只有收到所有确认信息,我才会弹出唯一的队列头。检查PriorityQueue中对象的字段

的问题是,作为确认消息到来时,我需要递增针对其接收该确认消息的确认计数器。为此,我需要通过检查队列中每条消息的特定字段(发送时间)来查找消息。

这怎么办?我认为以下几点:

获得一个迭代器,然后遍历队列检查每个对象的特定领域。

这似乎对我来说虽然残酷的方法。有没有更好的方法?我们可以像这样访问一个队列中的对象吗?


:我需要使用时Queue,因为我实现(在分布式系统中使用兰波特的逻辑时钟总订购多播)的功能需要有一个有序的队列。如果未由每个节点确认,则无法将队列头部的消息传递到应用程序线程。另外,即使收到所有确认,我也无法传递不在队列头部的消息。

回答

1

第一:是的,我们可以访问PriorityQueue这种方式,因为它的实施Iterable -interface。

当你想到的性能问题,您可以通过使用某种支点(见Quicksort)数向下的复杂性。

如果你觉得它在某种程度上愚蠢:最良好的解决方案都弄好了愚蠢的,但大多做工精细。

0

这听起来像你使用错误类型的数据结构。如果您正在接收来自队列(即JMS或类似的)的消息,那么为什么不从队列中读取消息并将数据存储到像Map(例如HashMap)或数据库(如果需要持久存储)的更合适的数据结构中。

当您收到确认后,您可以在Map中查找相应的对象并更新计数。如果这是您需要的,地图可能会有更快的随机访问。

如果增加的确认数量和达到的“现在我已经收到了我的所有确认”的阈值,那么你可以把消息到用于进一步处理的新的队列,如果这是你的愿望。

一些思考。希望我已经正确解释你的问题。

+0

我需要使用PriorityQueue,因为我正在实现的功能(使用Lamport逻辑时钟的分布式系统中的全部有序多播)需要有一个有序队列。如果未由每个节点确认,则无法将队列头部的消息传递到应用程序线程。另外,即使收到所有确认,我也无法传递不在队列头部的消息。 – aoak 2013-03-18 22:27:37