Просмотр полной версии : [Delphi] Вопрос на засыпку #3
RedFern.89
11.05.2010, 20:11
есть Memo примероного содержания:
Mygarin - Signs of Existence
mygrain - W.T.F.
Mygarin - Signs of Existence
MyGrain - Killing Time
MyGrain - W.T.F.
MyGrain - W.T.F.
желтым отмеченны повторяющиеся строчки, подлежащие удалению.
вопрос! как удалить все одинаковые строчки, оставляя только одну копию? Получится должно типа того:
Mygarin - Signs of Existence
mygrain - W.T.F.
MyGrain - Killing Time
всем заранее спасибо. Извините за такое ламерство.
ппц. гугл - не?
самое простое - через промежуточный TSTringList(есть свойство Duplicates, которому присвоиваешь dupIgnore).
RedFern.89
11.05.2010, 20:17
блин.. у мну моги щас кипят.. ктонить подкинет код?
procedure TForm1.Button1Click(Sender: TObject);
begin
With TStringList.Create() do
begin
Duplicates := dupIgnore;
Sorted := True;
AddStrings(Memo1.Lines);
Memo1.Clear();
Memo1.Text := Text;
Free();
end;
end;
RedFern.89
11.05.2010, 20:20
спасибо! а без сортировки можно какнить обойтись?
var
i:integer;
begin
i:=0;
while i < form1.Memo1.Lines.Count do
begin
if form1.Memo1.Lines.IndexOf(form1.Memo1.Lines[i]) < i then
form1.Memo1.Lines.Delete(i)
else
inc(i);
end;
end;
Сортировка не нужна, можешь её убрать.
RedFern.89
11.05.2010, 20:23
всем спасибо! вопрос закрыт..
Jaw, при большом кол-ве строк этот код оч. долго будет удалять дубли
Dizz, к сожелению или к счастью ты был прав мой код справился с файлом в ~5k строк за 2 минуты, код intNet за считаные милесекунды.
можно еще так: засовываешь текст мемо в стринглист, сортируешь его. далее - сравниваешь первую строку со второй, и если они совпадают - удаляешь вторую. если не совпадают - сравниваешь вторую с третьей. и т.д.
довольно шустрый метод, чесслово :)
Jingo Bo
12.05.2010, 00:31
Быстрее делать так, читаем из Memo.Lines.Strings, делаем двойной цикл(проверка текущего со всеми) при этом пишем в другой TStringList, потом Assign в Memo. Скорость обработки будет обратно пропорциональна прогрессу обработки + копирование данных.
greki_hoy
12.05.2010, 03:50
Dizz, к сожелению или к счастью ты был прав мой код справился с файлом в ~5k строк за 2 минуты, код intNet за считаные милесекунды.
~5k не показатель попробуйте для интереса 5 миллионов хотябы и этот код должен умереть в плане скорости
greki_hoy
12.05.2010, 03:59
можно еще так: засовываешь текст мемо в стринглист, сортируешь его. далее - сравниваешь первую строку со второй, и если они совпадают - удаляешь вторую. если не совпадают - сравниваешь вторую с третьей. и т.д.
довольно шустрый метод, чесслово :)
а можно еще так взять двоичное дерево поиска вствлять в него строки после вставки оно уже не содержит дубли
а за счет дерева и двоичного поиска обработает как минимум 5 миллионов очень быстро про какие то ~5k и говорить не стоит :)
RedFern.89
12.05.2010, 09:08
у меня списки маленькие. Максимуму до 2х к
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot