2011-07-06 61 views
5

如果我有一個數據結構我如何迭代開始在LinkedHashMap中的特定鍵?

Stock 
{ 
    String Symbol; 
    LinkedHashMap<Date,Double> DateForPrice; 
} 

我知道在LinkedHashMap中,我可以得到股價具體日期沒有遍歷整個列表。

但是,如果我想從特定日期開始遍歷DateForPrice的LinkedHashMap,有沒有辦法在不遍歷整個列表的情況下執行它?

+2

即使你可以跳到一個特定的地方,一個'LinkedHashMap'的迭代順序將是*插入順序*,而不是鍵的自然順序;那是你要的嗎? –

+0

是的,這就是我想要的。股票價格將按日期順序插入。 –

回答

0

我建議使用TreeMap代替 - 它會按日期排序,你可以使用tailMap獲得所需要的部分

7

LinkedHashMap不提供的方式開始在其下令取景當中迭代的地圖數據。假設你的用例真的是你想要的所有日期在一些Date d之後並且重複這些,那麼你應該把你的地圖存儲爲TreeMap。這裏一個重要的區別是LinkedHashMap的排序是插入順序,我們假設的用例在這裏是您想要的自然鍵順序TreeMap維護這樣一個視圖,通過地圖的關鍵字排列地圖的內容。

TreeMap s有額外的好處,允許您創建基於密鑰的地圖切片,因此您可以撥打tailMap(K k),返回所有密鑰發生在k之後的地圖。在這種情況下,您可以撥打tailMap,出發點爲d

例如爲:

TreeMap<Date, Double> dateForPrice; 

// load up dateForPrice 

Date start = // the point to start your iteration 

for(Entry<Date, Double> entry : dateForPrice.tailMap(start).entrySet()){ 
    // loop code 
} 

tailMap方法返回SortedMap,這是不可迭代。但它有entrySet方法返回Set,這是Iterable的子接口。

方便的是,如果你想保持存儲在LinkedHashMap你的數據,你可以簡單地加載了一個TreeMap與當前實例(有一些性能折衷,當然):

TreeMap<Date, Double> dateSortedDateForPrice = new TreeMap<Date, Double>(dateForPrice); 
+0

除了tailMap(),如果要綁定正在創建的新地圖,則可以使用subMap(Object fromKey,Object toKey)。 http://download.oracle.com/javase/1.4.2/docs/api/java/util/TreeMap.html –

+1

+1:值得一提的是,您真正想要的是任何NavigableMap例如TreeMap的。 –