2011-03-22 55 views
0

我知道隊列是通過頭部和/或尾部訪問的集合類型。隊列和地圖類型的功能之間的混合

我也明白,地圖是一種集合類型,它包含多個唯一鍵,每個鍵都有一個關聯的值。

我需要的是一張地圖,它具有固定數量的值,其中按鍵將被設置一次,並且在第一次設置後不會被更改。

困難的部分,我無法得到我的頭周圍是獲取值作爲一個固定長度的隊列,可以推動,而不會影響到關鍵。

例如:

初始集合(在頂部的最新項目):添加新價值的NewValue後

Key1, Value1 
Key2, Value2 
Key3, Value3 

收藏:

Key1, NewValue 
Key2, Value1 
Key3, Value2 

所以,我要鑰匙留相同,並且能夠通過將最早的值推到末尾並將所有其他值進一步向下移動到最後來添加新值。

如果像這樣的類型在框架內不可用,請有人推薦一種實現它的方法。

謝謝!

編輯: 爲什麼我需要做這方面的一個例子:

我需要能夠根據它 創建的時間段訪問值
例子:

鍵:0將包含從今天的值
鍵:-1將包含一個值昨日
重點:-2將包含從兩天前
值 等

只有一個值將被輸入每 一天,並且一個值將始終是 每天進入。

+0

呃,也許你可以描述爲什麼你想這樣做。我懷疑有一個更好的方法。 – 2011-03-22 05:23:36

+0

現在添加更多信息。 – Azz 2011-03-22 05:29:59

+0

所以你只需簡單地添加'NewValue',而不指定它所附帶的鍵,並且'map'知道它與'Key1'關聯? 或者你想爲每個鍵單獨的隊列?仍然不清楚...... – 2011-03-22 05:36:33

回答

3

聽起來像是你可以使用:

new LinkedHashMap<Long,V>(initialCapacity, loadFactor, false) { 
    protected boolean removeEldestEntry(Map.Entry<Long,V> e) { 
     return size() > MAX_ENTRIES; 
    } 
}; 

獲取或放置物品在這個地圖,你將需要規範化的時間戳,例如,以00:00:一天的00.000。

這種方法的一個優點是當「假設每天都會輸入一個值」這一假設被違反時,它不會默默地失敗。

1

所以,你真的在​​討論一個數組中的索引。

我只是將「ArrayList」封裝在對象中。

您的push方法也會從最後刪除「最老的」元素。您可以定義方法,如getToday()getPriorDay(numDaysBackFromToday)

但是,您使用的是大量的幻數有,如果你沒有實際存儲日期或與數據的時間。你是希望數據已正確加載。

就我個人而言,我會使用與LinkedHashMap中的數據關聯的時間戳,並重復找到您想要的數據。

0

我已經重新考慮了關於幻數的問題,並決定使用具有正指數的預定義集合類型更容易。然後我會簡單地使push方法在達到我需要的最大數量的值時將最後一項放下。

然後,我會讓我的課程將-1解釋爲1以獲得所需的值。

感謝您的幫助,我只是過度思考的事情。