PDA

Просмотр полной версии : [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


всем заранее спасибо. Извините за такое ламерство.

intNet
11.05.2010, 20:16
ппц. гугл - не?
самое простое - через промежуточный TSTringList(есть свойство Duplicates, которому присвоиваешь dupIgnore).

RedFern.89
11.05.2010, 20:17
блин.. у мну моги щас кипят.. ктонить подкинет код?

intNet
11.05.2010, 20:19
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
спасибо! а без сортировки можно какнить обойтись?

Jaw
11.05.2010, 20:21
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;

intNet
11.05.2010, 20:22
Сортировка не нужна, можешь её убрать.

RedFern.89
11.05.2010, 20:23
всем спасибо! вопрос закрыт..

Dizz
11.05.2010, 20:26
Jaw, при большом кол-ве строк этот код оч. долго будет удалять дубли

Jaw
11.05.2010, 20:46
Dizz, к сожелению или к счастью ты был прав мой код справился с файлом в ~5k строк за 2 минуты, код intNet за считаные милесекунды.

1n0y
12.05.2010, 00:25
можно еще так: засовываешь текст мемо в стринглист, сортируешь его. далее - сравниваешь первую строку со второй, и если они совпадают - удаляешь вторую. если не совпадают - сравниваешь вторую с третьей. и т.д.
довольно шустрый метод, чесслово :)

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х к