2013-03-18 57 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