![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
перемешать текстовый файл
lolka © (2006-01-25 23:53:00)Здравствуйте. Никогда не думал, что может возникнуть такая проблема, поэтому не знаю как её решать. Есть исходный текстовый файл(от 10000) строк. Необходимо в нём строки поменять местами случайным образом. Ну вот вроде и всё. Ребят помогите пожалуйста, потому что актуально только до завтра.
lolka (2006-01-26 01:44:00) [1]
>
>
> Думаю, справится в любом случае. Осталось выяснить, справится
> ли он с этим за разумное время. А в этом случае, практика
> — критерий истины. Т.е, сделать стресс-тест: создай файл
> в 100000 строк и протестируй скорость.
Чем и занимаюсь в данное время.;)
P.S. Всё потестил. Спасибо работает.
Всем кто принимал участие спасибо за помощь!!!:)
Джо (2006-01-26 01:38:00) [2]> [18] lolka (26.01.06 01:20)
> Только как думаете этот код справиться с файликом в 50000
> строк. Если нет, то как можно оптимизировать???
Думаю, справится в любом случае. Осталось выяснить, справится ли он с этим за разумное время.А в этом случае, практика — критерий истины. Т.е, сделать стресс-тест: создай файл в 100000 строк и протестируй скорость.
Плохиш (2006-01-26 01:36:00) [3]
> lolka (26.01.06 01:20) [18]
Опиши все используемые переменные в процедуре, а не глобально.
> Только как думаете этот код справиться с файликом в 50000
> строк.
Думаем да :-)
Кстати рекомендую сравнить оба твои варианта по скорости, первый конечно с учётом сделанных замечаний. Ну и вот тебе ещё один вариант:
procedure TForm1.Button2Click(Sender: TObject);
var
List1, List2: TStrings;
index: Integer;
begin
Randomize;
List1 := TStringList.Create;
List2 := TStringList.Create;
try
List1.LoadFromFile(filename);
while List1.Count > 0 do
begin
index:=Random(List1.Count);
List2.Add(List1.Strings[index]);
List1.Delete(index);
end;
List2.SaveToFile('c:\file.txt');
finally
List2.Free;
List1.Free;
end;
end;
lolka (2006-01-26 01:21:00) [4]Извините что флужу.:-)
> Молодец :-)
>
> Даже объект сразу правильно создал.
Спасибо.
> А что не так?
> В filename значение где-нибуть заносишь?
Да заношу.
Раньше компилятор ругался на что-то. Счас всё переделал. Остался вопрос необходима ли оптимизация???
lolka (2006-01-26 01:20:00) [5]Ура Работает.
procedure TForm1.Button2Click(Sender: TObject);
begin
Randomize;
TempList := TStringList.Create; { construct the list object }
TempList.LoadFromFile(filename);
count:=TempList.Count;
i:=0;
while i< count do
begin
j1:=Random(Count);
j2:=Random(Count-1);
TempList.Exchange(j1,j2);
inc(i)
end;
TempList.SaveToFile('c:\file.txt');
TempList.Free;
end;
Только как думаете этот код справиться с файликом в 50000 строк. Если нет, то как можно оптимизировать???
Плохиш (2006-01-26 01:17:00) [6]
> lolka (26.01.06 01:09) [15]
Молодец :-)
Даже объект сразу правильно создал.
> Посмотрите пожалуйста что не так.
А что не так?
В filename значение где-нибуть заносишь?
> for i:=1 to TempList.Count do
Заменить на
for i:=0 to TempList.Count - 1 do
Нумерация строк идёт с нуля.
Fay (2006-01-26 01:16:00) [7]Строки в TStringList индексируются с нуля.
lolka (2006-01-26 01:09:00) [8]Посмотрите пожалуйста что не так.
var
Form1: TForm1;
filename :string;
TempList: TStrings;
i,j,count: integer;
procedure TForm1.Button2Click(Sender: TObject);
begin
Randomize;
TempList := TStringList.Create; { construct the list object }
TempList.LoadFromFile(filename);
for i:=1 to TempList.Count do
begin
j:=Random(TempList.Count);
TempList.Exchange(i,j);
end;
TempList.SaveToFile('c:\file.txt');
TempList.Free;
end;
lolka (2006-01-26 01:02:00) [9]
> Надо набрать в редакторе кода TStringList и сразу же нажать
> F1
Да поймите вы я не далбайоп. Я просто почти не знаю Delphi. В хелпе я нашёл всё что надо. Мне интересно правильно ли я рассуждаю по поводу алгоритма или нет.
lolka (2006-01-26 01:00:00) [10]так ол-во строчек вроде
TempList.Count
palva (2006-01-26 00:59:00) [11]Надо набрать в редакторе кода TStringList и сразу же нажать F1
lolka (2006-01-26 00:57:00) [12]Всё, понял.
ТО бишь, я загружаю текстовый файл
TempList.LoadFromFile();
затем в цикле от 1 до последней строчки(кстати как узнать их кол-во) рандомим число из диапазона (1..Последняя строка) и методом Exchange меняем их местаами??? Или что-то не так?
Fay (2006-01-26 00:48:00) [13]2 lolka (26.01.06 0:46) [9]
Приходилось видеть строки вида
procedure TForm1.Button1Click(Sender : TObject);
?
Так вот TStringList находится на той же вкладке, что и TObject.
lolka (2006-01-26 00:46:00) [14]
> Ни на какой.
Это как???
Fay (2006-01-26 00:45:00) [15]2 lolka (26.01.06 0:38) [6]
На вкладках компоненты, т.е. наследники класса TComponent, каковым TStringList не является.
Fay (2006-01-26 00:44:00) [16]2 lolka (26.01.06 0:38) [6]
Ни на какой.
lolka (2006-01-26 00:38:00) [17]
> Если Вы в хелпе не можете найти TStringList и его методы,
> Вам просто невозможно помочь.
Я не так прочитал. Последний вопрос: на какой вкладке находиться TStringList?
Fay (2006-01-26 00:27:00) [18]2 lolka (26.01.06 0:21) [4]
Если Вы в хелпе не можете найти TStringList и его методы, Вам просто невозможно помочь.
lolka (2006-01-26 00:21:00) [19]
> 2 lolka (26.01.06 0:03) [2]
> TStringList + F1
ТАк не ужели трудно ответить. Я в хелпе ничего не нашёл.
Fay (2006-01-26 00:06:00) [20]2 lolka (26.01.06 0:03) [2]
TStringList + F1