Использование структуры данных для этого сценария

#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> as IndexedRecord implements List .

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() метода.