Как я могу выполнить итерацию, начиная с определенного ключа в LinkedHashMap? - PullRequest
5 голосов
/ 06 июля 2011

Если у меня есть структура данных

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

, которую я знаю в LinkedHashMap, я могу получить цену акций на определенную дату, не просматривая весь список.

Однако, если я хочуитерировать через LinkedHashMap DateForPrice, начиная с определенной даты, есть ли способ сделать это, не просматривая весь список?

Ответы [ 2 ]

7 голосов
/ 06 июля 2011

LinkedHashMap не предлагает способ начать итерацию в середине своего упорядоченного представления данных карты. Предположим, что ваш сценарий использования действительно заключается в том, что вам нужны все даты после некоторого Date d и для их повторения, тогда вам, вероятно, следует сохранить свою карту как TreeMap. Важным отличием здесь является то, что LinkedHashMap - это порядок вставки , и наш предполагаемый вариант использования здесь заключается в том, что вам нужен естественный порядок ключей . TreeMap s поддерживает такой вид, сортируя содержимое карты по ключу карты.

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 голосов
/ 06 июля 2011

Я бы предложил использовать TreeMap вместо этого - он будет отсортирован по дате, и вы можете использовать tailMap, чтобы получить необходимую порцию

...