2012-03-09 85 views
4

我的應用程序中有許多隊列和優先級隊列。我想要輕鬆訪問這些隊列中的第n個項目,但沒有看到使用API​​的簡單方法。我想我可以創建一個迭代器並迭代到第n個或使用toArray()[index] - 但它似乎應該有一個更簡單的方法。如何獲得Java中隊列中的第n個項目?

我錯過了什麼嗎?

+0

使用ArrayList作爲堆棧。當您需要特定物品時,您可以使用get(x)。 – 2012-03-09 16:37:11

+1

這不符合排隊的想法嗎?隊列應該是FIFO結構,而不是象地圖或數組那樣的按需訪問。你是否有理由使用Queue而不是List? – dardo 2012-03-09 16:38:12

+0

'Queue'接口不向直接元素訪問元素,只顯示在前面,並通過迭代器訪問。爲了您的使用,您可能需要一個基於List的集合。 – birryree 2012-03-09 16:38:40

回答

16

我錯過了什麼?

是 - 通過索引訪問元素不是隊列概念的一部分。

如果您需要通過索引訪問元素,您需要一個列表,而不是一個qeue。

2

一個隊列的整個點是隻對頭部(第一個元素)進行訪問。如果您想要對線性數據結構中的元素進行任意訪問,請使用List(如果您的查詢比push/pop更多,請考慮使用ArrayList,因爲LinkedList不針對隨機訪問進行優化)。

+0

'LinkedList'實現'Queue','ArrayList'不會。 – 2012-03-09 22:29:14

+0

@his:我的回答是他不應該使用Queue ADT,因爲它不支持隨機訪問,但他應該使用List(這兩者都實現)。所以我沒有看到相關性。 – 2012-03-10 17:05:43

2

最簡單的解決方案是使用自平衡的binary search treeAVL tree, splay tree or red-black tree。它允許你通過O(log n)時間的密鑰訪問元素,並按O(log n + k)的次序遍歷對象,其中k是迭代元素的數量。

+4

這些選項中的任何一個都是過度的IMO。 – aglassman 2012-03-09 16:44:25

+1

基於數組的隊列或列表會給你O(1)。而且非常快O(1),在那。 – yshavit 2012-03-09 16:56:30

1

我在您使用的Queues什麼具體的數據類型,我的應用程序

一些隊列和優先級隊列? A LinkedList?在這種情況下,您應該可以通過轉換回鏈接列表來獲取第n th元素。

但是,這是不是你將如何使用Queue

而對於優先級隊列,從你的問題看來你還沒有使用正確的數據結構。

優先級隊列將始終返回最小元素(通過排序)。
那麼你在這裏指什麼n元素?n最小還是n插入什麼?所以我們不能說在這種情況下該怎麼做

+0

只需要注意,獲取「LinkedList」的第n個元素相當於將「Queue」迭代到第n個元素。 – 2012-03-09 16:42:59

+0

@MarkPeters:你說得對,但這不是正確使用'Queue',在代碼中看到這一點很尷尬。所以最好使用例如。作爲'LinkedList'直接,因爲它反映了你正在嘗試做的更好 – Cratylus 2012-03-09 16:44:50

+0

@user:我會同意只是使用'List'更好,但迭代在'Queue'在我腦海中比* cast *更好一個'LinkedList'因爲它將你自己連接到一個實現細節。如果OP有能力改變提供'Queue'的代碼,我完全同意。 – 2012-03-09 16:52:48

1

隊列不允許按概念進行隨機索引訪問,因此接口不允許這樣做。如果您同時需要兩種訪問方式(這是設計的錯誤標誌),那麼您可以使用實現ListQueue(例如LinkedList)的數據類型。

相關問題