2011-07-06 11 views
5

Jeśli mam struktury danychJak mogę iterować zaczynając od określonego klucza w LinkedHashMap?

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

wiem w LinkedHashMap, można uzyskać cenę akcji o określonej dacie, bez przechodzenia przez całą listę.

Jednakże, jeśli chcę iterować poprzez LinkedHashMap of DateForPrice począwszy od określonej daty, czy jest jakiś sposób, aby to zrobić bez przechodzenia przez całą listę?

+2

Nawet jeśli można przejść do w określonym miejscu kolejność iteracji 'LinkedHashMap' będzie * porządkiem wstawiania *, a nie naturalną kolejnością klawiszy; czy tego chcesz? –

+0

Tak, właśnie tego chcę. Cena akcji zostanie dodana w kolejności od daty. –

Odpowiedz

0

sugeruję użycie TreeMap zamiast - będzie sortowane według daty i można korzystać tailMap aby uzyskać wymaganą część

7

LinkedHashMap nie oferuje sposób na rozpoczęcie iteracji w środku jego uporządkowanego widzenia danych mapy. Przypuśćmy, że chcesz użyć wszystkich dat po jakimś numerze Date d i powtórzyć te, a następnie powinieneś zapisać swoją mapę jako TreeMap. Ważnym rozróżnieniem jest to, że zamawianie LinkedHashMap jest zamawiania-zamówienia, a naszym domniemanym przypadkiem użycia jest to, że chcesz mieć naturalny klucz-zamówienie. TreeMap s utrzymują taki widok, sortując zawartość mapy za pomocą klawisza mapy.

TreeMap s mają dodatkową zaletę, że pozwala na tworzenie plasterków mapie opartej na kluczu, więc można zadzwonić tailMap(K k), aby powrócić mapę z wszystkie przyciski występujące po k. W takim przypadku możesz zadzwonić pod numer tailMap z punktem początkowym, d.

np .:

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 sposób powraca SortedMap, co nie jest iterowalny. Ale ma on metodę entrySet zwracającą Set, która jest podinterfejsem Iterable.

Wygodnie, jeśli chcesz zachować przechowywania danych w LinkedHashMap można po prostu załadować do TreeMap z bieżącej instancji (z jakiegoś kompromisu wydajności, oczywiście):

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

oprócz tailMap() możesz użyć subMap (Object fromKey, Object toKey), jeśli chcesz związać nową mapę, którą tworzysz. http://download.oracle.com/javase/1.4.2/docs/api/java/util/TreeMap.html –

+1

+1: Warto wspomnieć, że naprawdę zależy Ci na NavigableMap np. TreeMap. –

Powiązane problemy