Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.04 c
9-1123469820
Xeno
2005-08-08 06:57
2006.02.26
Послнедний снимок CVS GLScene от 06.08.2005


1-1138268273
BFG9k
2006-01-26 12:37
2006.02.26
Много HELP файлов в одном проекте


15-1139184926
Yegorchic
2006-02-06 03:15
2006.02.26
Оцените/покритикуйте программу...


1-1138254587
СержК
2006-01-26 08:49
2006.02.26
Как ограничить по времени "замирание" программы


11-1120230528
Dodfr
2005-07-01 19:08
2006.02.26
Move TListView items with Drag&amp;Drop how to ?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский