Мне нужна структура данных для эффективной обработки с датами - PullRequest
1 голос
/ 13 мая 2010

Что мне нужно, так это что-то вроде Hashtable, которое я буду заполнять ценами, которые были актуальны в желаемые дни.

Например: я поставлю две цены: 1 января: 100USD, 5 марта: 89USD.

Если я поищу в своей хеш-таблице цену: hashtable.get (14 февраля), мне понадобится вернуть мне действительную цену, которая была введена 1 января, потому что это последняя фактическая цена. Обычная реализация с хеш-таблицами ничего мне не вернет, так как ничего не помещено в этот набор данных.

Мне нужно посмотреть, есть ли такая реализация, которая может быстро найти объект на основе диапазона дат.

Ответы [ 4 ]

5 голосов
/ 13 мая 2010

От макушки головы есть несколько способов, но я бы использовал TreeMap<Date> (или Calendar и т. Д.).

Когда вам нужно вытащить Date date, попробуйте следующее:

  1. Попытка get(date)
  2. Если результат null, то результат в headMap(date).lastKey()

Один из них будет работать. Конечно, сначала проверьте размер headMap(date), потому что lastKey() выдаст Exception, если он пуст.

0 голосов
/ 13 мая 2010

У вас есть все инструменты под рукой. Рассмотрим TreeMap. Затем вы можете создать заголовок, который содержит только ту часть карты, которая строго ниже заданного значения. Пример реализации:

TreeMap<Date,Double> values = new TreeMap<Date,Double>();
...fill in stuff...
Date searchDate = ...anydate...
// Needed due to the strictly less contraint:
Date mapContraintDate = new Date(searchDate.getTime()+1); 
Double searchedValue = values.get(values.headMap(mapContraintData).lastKey);

Это эффективно, потому что headMap не создается путем копирования исходной карты, а возвращает только вид.

0 голосов
/ 13 мая 2010

Создание древовидной карты с датой, строкой. Если кто-то запрашивает дату, тогда преобразуйте строку в дату и вызовите map.get (date), если найдете, возьмите предыдущий ключ, чем текущий элемент.

0 голосов
/ 13 мая 2010

Вы можете использовать объект DatePrice, содержащий оба объекта, и сохранять их в списке или массиве по дате, а затем использовать двоичный поиск (доступен в классах Collections и Arrays), чтобы найти ближайшую дату. 1004 *

Это было бы значительно более эффективным способом использования памяти, чем при использовании TreeMap, и не похоже, что вы захотите вставлять или удалять данные произвольно (что может привести к снижению производительности массива).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...