如果我有一個數據結構我如何迭代開始在LinkedHashMap中的特定鍵?
Stock
{
String Symbol;
LinkedHashMap<Date,Double> DateForPrice;
}
我知道在LinkedHashMap中,我可以得到股價具體日期沒有遍歷整個列表。
但是,如果我想從特定日期開始遍歷DateForPrice的LinkedHashMap,有沒有辦法在不遍歷整個列表的情況下執行它?
如果我有一個數據結構我如何迭代開始在LinkedHashMap中的特定鍵?
Stock
{
String Symbol;
LinkedHashMap<Date,Double> DateForPrice;
}
我知道在LinkedHashMap中,我可以得到股價具體日期沒有遍歷整個列表。
但是,如果我想從特定日期開始遍歷DateForPrice的LinkedHashMap,有沒有辦法在不遍歷整個列表的情況下執行它?
我建議使用TreeMap
代替 - 它會按日期排序,你可以使用tailMap
獲得所需要的部分
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);
除了tailMap(),如果要綁定正在創建的新地圖,則可以使用subMap(Object fromKey,Object toKey)。 http://download.oracle.com/javase/1.4.2/docs/api/java/util/TreeMap.html –
+1:值得一提的是,您真正想要的是任何NavigableMap例如TreeMap的。 –
即使你可以跳到一個特定的地方,一個'LinkedHashMap'的迭代順序將是*插入順序*,而不是鍵的自然順序;那是你要的嗎? –
是的,這就是我想要的。股票價格將按日期順序插入。 –