Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

TStringList vs. TList<string>


TObject ©   (2010-12-14 15:44:00) 

В рамках метода собственного класса необходимо получить и хранить отсортированный по году список имен файлов формата log_<день>_<месяц>_<год>. Что посоветуете использовать: TStringListили TList<string>?


clickmaker   (2010-12-15 11:23:00) [1]

> что на самом деле лучше

xml? -)


Jeer   (2010-12-15 10:46:00) [2]

Когда-то давно тестировал способы представления данных в словарях TStringList, THashedStringList и TStringDictionary (DF).
Т.е.
lst.Value['Key'] := 'Value';
и тд
Результаты остались и привожу:

Время (сек) формирования словаря ( отсортированного ) емкостью N килослов, приведенное к частоте 1 ГГц:
t = (1/F)*(A + B*N + C*N^2)

TStringList
A = 0.36
B = 0.08
C = 1.14

THashedList
A = 0.03
B = 0.19
C = 1.93

К примеру, на 1000 слов имеем 1.3 и 1.8 сек соответственно.

Для TStringDictionary все на порядок лучше, вдобавок функция линейна
t = (1/F)*2.45*N; [msec]
Т.е. для 1000 слов имеем 2.45 мс, приведенные к частоте 1ГГц.


DVM   (2010-12-14 23:08:00) [3]

Щас придет Медвежонок и объяснит, что на самом деле лучше.


_Юрий   (2010-12-14 19:37:00) [4]


> В рамках метода собственного класса необходимо получить
> и хранить отсортированный по году список имен файлов формата
> log_<день>_<месяц>_<год>. Что посоветуете использовать:
> TStringList или TList<string>?


TDictionary<string, TDateTime>


Anatoly Podgoretsky   (2010-12-14 19:15:00) [5]

> TObject  (14.12.2010 16:40:12)  [12]

А нельзя ли сделать формат log_гггг_мм_дд.log
Тогда и сортировать нечего, stringlist сам это сделает.


Ega23   (2010-12-14 17:09:00) [6]

При больших объёмах данных StringList будет тормозить.
Бери обычный TList и дихотомией фигач туда Pointer(Value);


И. Павел   (2010-12-14 17:04:00) [7]


> а как мне быстро выцеплять после очередного FindNext месяц
> и год из имени файла. Для каждого найденного файла делать
> Copy, Pos? Или лучше заюзать регэкспы.

Если месяц и год занимают строго два символа (например 01, 05), то достаточно одного Copy. А иначе - искать символы "_" и выделять числа между ними - что, наверное, проще сделать простым проходом строки в цикле, чем комбинацией с pos. Все равно, даже при использовании StringList, придется выделять дату для сортировки, так что без этого не обойтись.

Регулярные выражения для такой простой операции слишком тяжелые и медлительные.


Германн   (2010-12-14 17:03:00) [8]


> по тз файлы имеют формат log_<день>_<месяц>_<год>.log
>

А надо было бы log_<год>_<месяц>_<день>.log


TObject   (2010-12-14 16:40:00) [9]

по тз файлы имеют формат log_<день>_<месяц>_<год>.log

Пример:

log_14_11_2010.log
log_13_12_2010.log
log_14_12_2010.log


Anatoly Podgoretsky   (2010-12-14 16:37:00) [10]

А надо из имени или из даты файла


TObject   (2010-12-14 16:35:00) [11]


> Зачем хранить строки, если можно обойтись числами (датами).
>  Такой механизм будет работать быстрее. Вместо сортировки
> - бинарный поиск и вставка даты после очередного FindNext.
>
>
> А строки можно получать уже при обработке этого массива.
>


а как мне быстро выцеплять после очередного FindNext месяц и год из имени файла. Для каждого найденного файла делать Copy, Pos? Или лучше заюзать регэкспы.


Anatoly Podgoretsky   (2010-12-14 16:23:00) [12]

> TObject  (14.12.2010 15:44:00)  [0]

Имена файлов это строка, а с TList ты возможно споткнешься со временем жизни
строки.


sniknik   (2010-12-14 16:21:00) [13]

> Что посоветуете использовать: TStringList или TList<string>?
TADO/TClientDatased / TMemoryTable.


Jeer   (2010-12-14 16:18:00) [14]

А.. я не обратил внимание на необходимость сортировки по году.
Ну.. опять же, перейти к варианту TStringList в режиме словаря
"год" = "имя_файла"

Или же нужна сортировка год, месяц, день, что логично ?


И. Павел   (2010-12-14 16:17:00) [15]

Зачем хранить строки, если можно обойтись числами (датами). Такой механизм будет работать быстрее. Вместо сортировки - бинарный поиск и вставка даты после очередного FindNext.

А строки можно получать уже при обработке этого массива.


TObject   (2010-12-14 16:10:00) [16]


> А вот это я не понял...


Вызывается метод. В нем я получаю список имен файлов из папки (FindFirst, FindNext), сортирую по месяцу и году, далее далее что-то делаю и удаляю список, т.о. список создается и уничтожается в рамках метода (временный
).  


> Ну и чем TStringList не устраивает ?


что в TStingList, что в TList<string> самому нужно писать сортировку. TStringList сортирует по алфавиту. + в TStringList дофига методов которые мне не нужны вообще. Поэтому склоняюсь больше к TList<string>


Jeer   (2010-12-14 16:01:00) [17]

Если же еще надо искать, то THashedStringList


И. Павел   (2010-12-14 16:01:00) [18]


> В рамках метода собственного класса необходимо получить и хранить

А вот это я не понял... Если в C++ что-то нужно хранить "в рамках метода", используют статические переменные. Но вряд ли это то что нужно в этом случае.


Jeer   (2010-12-14 16:00:00) [19]

Ну и чем TStringList не устраивает ?


И. Павел   (2010-12-14 15:57:00) [20]

var list: array of TDateTime;


Наверх

Титульная страница Поиск, карта сайта Написать письмо