![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сформировать список
NieL © (2011-02-02 15:06:00)в каталоге помимо прочих файлов, хранятся файлы в формате test1.txt, test6.txt, test11.txt test24.txt, ... Нужно сформировать список имен файлов в таком формате и отсортировать его по целочисленному значению в имени файла. Как грамотнее сделать:
[1-й вариант]: сортировать после сформированный список
1. FindFirst/FindNext формируем TStringList
2. Пишем функцию сортировки (MySortProc)
3. Вызываем TStringList.CustomSort(MySortProc)
[2-й вариант]: сортировать на момент формирования списка
Как лучше?
Anatoly Podgoretsky (2011-02-02 22:56:00) [21]> Ega23 (02.02.2011 22:28:09) [9]
Это нормально когда известно сколько и когда калькулятор есть.
Ega23 (2011-02-02 22:28:00) [22]
> 0000022
> 2000000
Ну и чо, нормально. Как раз.
Anatoly Podgoretsky (2011-02-02 22:18:00) [23]> NieL (02.02.2011 15:06:00) [0]
Как угодно, результат одинаковый, лишь бы правильно.
Anatoly Podgoretsky (2011-02-02 22:17:00) [24]> Ega23 (02.02.2011 15:11:03) [3]
0000022
2000000
Ega23 (2011-02-02 15:33:00) [25]
> отсортировать готовый список - то быстрее, чем пересортировывать
> список при каждой вставке,
Ой-ли?
KSergey (2011-02-02 15:30:00) [26]Первый вариант правильнее.
Во-первых, логика и код сортировки будет в явном виде отвязан от получения списка, между ними будет универсальный интерфейс в виде TStringList, т.е. легче отлаживать и переиспользовать части кода, во-вторых, отсортировать готовый список - то быстрее, чем пересортировывать список при каждой вставке, либо придется хранить его сразу в таком контейнере, чтобы вставка шла быстро в нужное место.
niel (2011-02-02 15:28:00) [27]вот набросал если делать по варианту 2:
И еще: мне переодически нужно будет сравнивать значения в именах файла, можем стоит сделать целочисленный список для удобства, а когда необходимо полное имя файла, только добавлять приставку 'test' и окончание '.txt'.
procedure TForm1.Button1Click(Sender: TObject);
var
find_data: WIN32_FIND_DATA;
hFind: Cardinal;
X, N: Integer;
Prepared: TList<Integer>;
begin
Prepared := TList<Integer>.Create(
TComparer<Integer>.Construct(
function (const AVal1, AVal2: Integer): Integer
begin
Result := CompareValue(AVal1, AVal2);
end
));
try
hFind := FindFirstFile(PChar(Fwork_dir + 'test*.txt'), find_data);
if hFind <> INVALID_HANDLE_VALUE then
try
repeat
get_num(find_data.cFileName, X);
Prepared.BinarySearch(X, N);
Prepared.Insert(N, X);
until
not FindNextFile(hFind, find_data);
finally
FindClose(hFind);
end;
// ... что-то делаем
finally
Prepared.Free;
end;
end;
Ega23 (2011-02-02 15:11:00) [28]
> на момент test11 будет перед test2
Ну дык. Надо же с нуля начинать. 01, 02, ..., 09, 10, 11, 12, ...
тогда всё нормуль будет.
Ega23 (2011-02-02 15:09:00) [29]
> Как лучше?
От задачи зависит. Тупо, дёшево и в лоб - 1-й вариант.
Игорь Шевченко (2011-02-02 15:09:00) [30]сортировать сформированный. на момент test11 будет перед test2