2011-11-30 5 views
1

У меня есть довольно большой текстовый файл (строки ~ 4 м). Я бы хотел разобрать, и я ищу совет о подходящей структуре данных для хранения данных. Файл содержит строки, подобные следующим:Соответствующая структура данных Java для синтаксического анализа большого файла данных

Date  Time Value 
2011-11-30 09:00 10 
2011-11-30 09:15 5 
2011-12-01 12:42 14 
2011-12-01 19:58 19 
2011-12-01 02:03 12 

Я хочу, чтобы сгруппировать строки по дате, моя первая мысль была использовать TreeMap<String, List<String>> для отображения даты в остальной части линии, но это TreeMap из List са смешно вещь которую нужно сделать? Я полагаю, что я могу заменить клавишу String на объект даты (чтобы устранить так много сопоставлений строк), но это List, поскольку значение, которое меня беспокоит, может оказаться непригодным.

Я использую TreeMap, потому что я хочу перебирать ключи в порядке дат.

ответ

1

является TreeMap списков, что смешно делать?

Концептуально нет, но это будет очень памяти неэффективным (как из-за Map и из-за List). Вы смотрите на накладные расходы на 200% и более. Что может быть или не быть приемлемым, в зависимости от того, сколько памяти вам нужно тратить.

Для более памятей эффективных решений, создать класс, который имеет поле для каждого столбца (в том числе Date), поставить все те, в List и сортировать его (в идеале с помощью быстрой сортировки), когда вы закончите чтение.

+0

Справедливости ради, накладные расходы на память Карты немного зависят от распределения ключей. Если многие ключи повторно используются несколько раз, это может даже экономить память. – Ingo

+0

Как неэффективно использовать память в качестве значения? Если вы создадите отдельный класс для использования в качестве значения, а затем сохраните «Список» внутри этого класса, вы все равно создаете такое же количество «списков». – Michael

1

Нет возражений против использования списков. Хотя в вашем случае может быть List<Integer>, поскольку значения Карты будут уместны.

+0

И как вы сопоставляете дату-время с элементами списка? – CKuck

+0

Через «Карту», ​​конечно. Каждый элемент списка под одним и тем же ключом имел именно данные/время. – Ingo

+0

Извините, я включил только небольшой образец моих данных, есть больше строк, чем только дата, время и значение. Спасибо за ваше предложение, хотя :) – jackbot

2

Нет ничего плохого в использовании List в качестве значения для Map. Все эти <> выглядят уродливыми, но вполне нормально поставить класс generics внутри класса generics.

Вместо того, чтобы использовать ключ String, вероятно, было бы лучше использовать java.util.Date, поскольку ключи являются датами. Это позволит TreeMap более точно отсортировать даты. Если вы сохраняете даты как Strings, то TreeMap может неправильно сортировать даты (они будут отсортированы как строки, а не как «настоящие» даты).

Map<Date, List<String>> map = new TreeMap<Date, List<String>>(); 
Смежные вопросы