Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.02.26;
Скачать: CL | DM;

Вниз

перемешать текстовый файл   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.042 c
2-1139823436
denis24
2006-02-13 12:37
2006.02.26
кол-во дней между двумя датами


15-1139406897
RDA
2006-02-08 16:54
2006.02.26
Ну вот и все. Борланд нас покидает?


1-1138016742
Eraser
2006-01-23 14:45
2006.02.26
Ньюанс при добавлении формы в таск бар.


2-1139157802
Вячеслав Бессонов
2006-02-05 19:43
2006.02.26
Сохранение


2-1139726738
Delphi_is_cool
2006-02-12 09:45
2006.02.26
ShowModal.