#java #data-structures
#java #структуры данных
Вопрос:
У меня есть данные в следующей форме —
01/04/2011 - {00:00,1.0} ; {01:00,2.0} ; {02:00,1.5} ;{04:00,2.3}
02/04/2011 - {00:00,2.0} ; {01:00,2.1} ; {02:00,1.5} ;{04:00,2.3}
03/04/2011 - {00:00,3.0} ; {01:00,2.0} ; {02:00,1.6} ;{04:00,2.3}
04/04/2011 - {00:00,1.0} ; {01:00,2.5} ; {02:00,1.57} ;{04:00,2.3}
05/04/2011 - {00:00,1.9} ; {01:00,2.7} ; {02:00,1.5} ;{04:00,2.3}
06/04/2011 - {00:00,1.08} ; {01:00,2.02} ; {02:00,1.9} ;{04:00,2.3}
07/04/2011 - {00:00,1.7} ; {01:00,2.0} ; {02:00,1.10} ;{04:00,2.3}
Я должен хранить их в некоторой структуре данных, чтобы я мог получить к ним доступ, используя даты в качестве ключа.Также для конкретного дня пары {k, v} должны быть упорядочены так, как они вставляются.
Пожалуйста, подскажите, какую структуру данных лучше всего использовать в этом сценарии, и объясните, почему ее следует использовать. Заранее спасибо!
Комментарии:
1. Тони, это не домашнее задание… У меня есть сценарий, в котором мне нужно реализовать это, и я понятия не имею, как сделать это выше…. Пробовал использовать LinkedHasMap<String ,LinkedHashMap<String,Float>> но не уверен, что это хороший подход..
Ответ №1:
Для меня звучит точно так же, как Map<Date,List<Record>>
. Если вы используете HashMap
, то поиск заданной даты будет операцией O(1). При использовании этого подхода нет особого порядка.
В качестве альтернативы вы могли бы использовать LinkedHashMap
тогда порядок может быть сохранен, что может быть полезно, если вам нужно просмотреть записи в порядке дат.
Комментарии:
1. Если упорядочение зависит от значений, использование
IndexedRecord
в качествеRecord
реализации будет обрабатывать упорядочение.2. Я только что перечитал это — я не верю, что вам нужно делать
List<Record>
asIndexedRecord
implementsList
.3. @Riggy: Я почти уверен, что @Jeff имел в виду
Record
просто произвольное имя для типа данных «значение». Он не имел в видуjavax.resource.cci.Record
. Я уверен, что OP не хочет вводить совершенно несвязанную библиотеку.4. Да, извините, я просто имел в виду какой-то произвольный класс. Я никогда раньше не видел класс Record или IndexRecord.
Ответ №2:
Для меня это похоже на MultiMap.
MultiMap<Date, SomeRecord> records = ArrayListMultiMap.create();
records.put(..., ...);
Комментарии:
1. Да. ArrayListMultimap, если быть точным.
2. Как бы вы сохранили порядок SomeRecord?
3. @Jeff: Это обеспечивается ArrayListMultiMap : При переборе коллекций, предоставляемых этим классом, порядок значений для данного ключа согласуется с порядком, в котором были добавлены значения.
Ответ №3:
Я думаю, что лучшим решением является такая структура: http://download.oracle.com/javase/1.4.2/docs/api/java/util/LinkedHashMap.html
Записи сохраняются в том порядке, в котором они были вставлены. Есть еще один хороший момент — благодаря хэшированию ключа поиск в списке выполняется быстрее.
Ответ №4:
Из ваших примеров данных видно, что значения для каждой даты — это просто набор чисел для каждого часа. Таким образом, вы могли бы просто использовать Map<Date, Float>
, если для каждого числа всегда есть только одна дата и время. Например, «01/04/2011 00:00» равно «1.0», а «01/04/2011 01:00» равно «2.0». Вы могли бы упорядочить их с помощью TreeMap<Date, Float>
и извлечь только те диапазоны дат, которые вам нужны, с помощью subMap()
метода.