Какой тип данных / структура для хранения информации списка файлов? - PullRequest
2 голосов
/ 17 июля 2009

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

Ответы [ 4 ]

4 голосов
/ 17 июля 2009

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

3 голосов
/ 17 июля 2009

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

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

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

2 голосов
/ 17 июля 2009

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

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

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

1 голос
/ 17 июля 2009

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

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

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