Форум: "Основная";
Текущий архив: 2006.02.26;
Скачать: [xml.tar.bz2];
Внизперемешать текстовый файл Найти похожие ветки
← →
lolka (2006-01-25 23:53) [0]Здравствуйте. Никогда не думал, что может возникнуть такая проблема, поэтому не знаю как её решать. Есть исходный текстовый файл(от 10000) строк. Необходимо в нём строки поменять местами случайным образом. Ну вот вроде и всё. Ребят помогите пожалуйста, потому что актуально только до завтра.
← →
Джо © (2006-01-25 23:56) [1]Самое простое: считать файл в TStringList. Затем пользуясь функцией Random и методом Exchange поменять случайные строки случайным образом. После этого сохранить TStringList в файл.
← →
lolka (2006-01-26 00:03) [2]Джо спасибо что ответил. А как текстовый файл загрузить в TStringList. И что за метод Exchange. Пожалуйста по подробнее.:)
← →
Fay © (2006-01-26 00:06) [3]2 lolka (26.01.06 0:03) [2]
TStringList + F1
← →
lolka (2006-01-26 00:21) [4]
> 2 lolka (26.01.06 0:03) [2]
> TStringList + F1
ТАк не ужели трудно ответить. Я в хелпе ничего не нашёл.
← →
Fay © (2006-01-26 00:27) [5]2 lolka (26.01.06 0:21) [4]
Если Вы в хелпе не можете найти TStringList и его методы, Вам просто невозможно помочь.
← →
lolka (2006-01-26 00:38) [6]
> Если Вы в хелпе не можете найти TStringList и его методы,
> Вам просто невозможно помочь.
Я не так прочитал. Последний вопрос: на какой вкладке находиться TStringList?
← →
Fay © (2006-01-26 00:44) [7]2 lolka (26.01.06 0:38) [6]
Ни на какой.
← →
Fay © (2006-01-26 00:45) [8]2 lolka (26.01.06 0:38) [6]
На вкладках компоненты, т.е. наследники класса TComponent, каковым TStringList не является.
← →
lolka (2006-01-26 00:46) [9]
> Ни на какой.
Это как???
← →
Fay © (2006-01-26 00:48) [10]2 lolka (26.01.06 0:46) [9]
Приходилось видеть строки видаprocedure TForm1.Button1Click(Sender : TObject);
?
Так вот TStringList находится на той же вкладке, что и TObject.
← →
lolka (2006-01-26 00:57) [11]Всё, понял.
ТО бишь, я загружаю текстовый файлTempList.LoadFromFile();
затем в цикле от 1 до последней строчки(кстати как узнать их кол-во) рандомим число из диапазона (1..Последняя строка) и методом Exchange меняем их местаами??? Или что-то не так?
← →
palva © (2006-01-26 00:59) [12]Надо набрать в редакторе кода TStringList и сразу же нажать F1
← →
lolka (2006-01-26 01:00) [13]так ол-во строчек вроде
TempList.Count
← →
lolka (2006-01-26 01:02) [14]
> Надо набрать в редакторе кода TStringList и сразу же нажать
> F1
Да поймите вы я не далбайоп. Я просто почти не знаю Delphi. В хелпе я нашёл всё что надо. Мне интересно правильно ли я рассуждаю по поводу алгоритма или нет.
← →
lolka (2006-01-26 01:09) [15]Посмотрите пожалуйста что не так.
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;
← →
Fay © (2006-01-26 01:16) [16]Строки в TStringList индексируются с нуля.
← →
Плохиш © (2006-01-26 01:17) [17]
> lolka (26.01.06 01:09) [15]
Молодец :-)
Даже объект сразу правильно создал.
> Посмотрите пожалуйста что не так.
А что не так?
В filename значение где-нибуть заносишь?
> for i:=1 to TempList.Count do
Заменить на
for i:=0 to TempList.Count - 1 do
Нумерация строк идёт с нуля.
← →
lolka (2006-01-26 01:20) [18]Ура Работает.
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 строк. Если нет, то как можно оптимизировать???
← →
lolka (2006-01-26 01:21) [19]Извините что флужу.:-)
> Молодец :-)
>
> Даже объект сразу правильно создал.
Спасибо.
> А что не так?
> В filename значение где-нибуть заносишь?
Да заношу.
Раньше компилятор ругался на что-то. Счас всё переделал. Остался вопрос необходима ли оптимизация???
← →
Плохиш © (2006-01-26 01:36) [20]
> 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;
← →
Джо © (2006-01-26 01:38) [21]> [18] lolka (26.01.06 01:20)
> Только как думаете этот код справиться с файликом в 50000
> строк. Если нет, то как можно оптимизировать???
Думаю, справится в любом случае. Осталось выяснить, справится ли он с этим за разумное время. А в этом случае, практика — критерий истины. Т.е, сделать стресс-тест: создай файл в 100000 строк и протестируй скорость.
← →
lolka (2006-01-26 01:44) [22]
>
>
> Думаю, справится в любом случае. Осталось выяснить, справится
> ли он с этим за разумное время. А в этом случае, практика
> — критерий истины. Т.е, сделать стресс-тест: создай файл
> в 100000 строк и протестируй скорость.
Чем и занимаюсь в данное время.;)
P.S. Всё потестил. Спасибо работает.
Всем кто принимал участие спасибо за помощь!!!:)
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2006.02.26;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.038 c