2009-07-17 4 views
2

У меня есть приложение, которое ищет файлы на компьютере (настраиваемый путь, тип и т. Д.). В настоящее время он добавляет информацию в базу данных, как только будет найден соответствующий файл. Вместо этого я хочу хранить информацию в памяти для дальнейших манипуляций перед вставкой в ​​базу данных. Список может содержать много элементов. Я считаю эффективность работы важным фактором. Мне может потребоваться итерация через элементы, поэтому структура, которая может быть легко закодирована, является еще одной ключевой проблемой. и как я могу получить ассоциативные массивы типа php для этой работы?Какой тип данных/структура для хранения информации о списке файлов?

ответ

1

Попробуйте использовать AVL-дерево на http://sourceforge.net/projects/alcinoe/ как ваш ассоциативный массив. Он имеет итерационный метод для быстрой итерации. Возможно, вам придется извлечь из своего базового слоя и реализовать собственный компаратор, но он прост в использовании.

Примеры включены.

4

Если вы используете Delphi 2009, вы можете использовать TDictionary. Он принимает два общих параметра. Первая должна быть строкой для имени файла, а вторая - любым типом данных, с которым вы связываете. Он также имеет три встроенных счетчика, один для пар ключ-значение, один для ключей и один для значений, что упрощает итерацию.

3

Другим решением было бы использовать только стандартный TStringList.

Пока он отсортирован и имеет некоторые повторяющиеся настройки, отличные от dupAccept, вы можете использовать indexof или indexofname для быстрого поиска элементов в списке.

В нем также есть добавление объектов, которое позволяет хранить информацию об объекте, прикрепленную к имени. Начиная с D2009, TStringList имеет свойство OwnsObject, которое позволяет делегировать очистку объекта в TStringList. До D2009 вы должны справиться с этим сами.

2

Значительная часть этого будет зависеть от того, как вы собираетесь использовать список и какой масштаб. Если вы собираетесь использовать его как стек или очередь, тогда TList будет работать нормально. Если вам нужно выполнить поиск по списку для определенного элемента, вам потребуется что-то, что позволяет быстрее извлекать данные. TDictionary (2009) или TStringList (до 2009 года) будет наиболее вероятным выбором.

Динамические массивы также являются возможными, но если вы их используете, вы захотите свести к минимуму использование SetLength, поскольку каждый раз, когда он называется, он будет переназначать память. TList управляет этим для вас, поэтому я предложил использовать TList. если вы ЗНАЕТ, сколько вы будете иметь дело заранее, тогда используйте динамический массив и установите его длину в начале.

Если у вас есть больше предметов, чем подходит в памяти, тогда ваш выбор также изменится. В этот момент я либо использовал бы таблицу базы данных, либо tFileStream, чтобы хранить обрабатываемые записи, а затем искать начало таблицы/потока для обработки.