![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Удаление повторений в TStringlist [D7, Win95/98, WinME, NT4, Win2k, WinXP]
gid © (2004-10-01 14:37:00)В TStringList имеется множество повторяющихся строк, как их удалить как можно быстрее (строк около 200 000).
begin...end (2004-10-01 20:04:00) [1]
> [20] default © (01.10.04 17:37)
Да, не подумал я как следует, извиняюсь.
default (2004-10-01 17:37:00) [2][17]
неа, представь если список состоит из одинаковых строк и посмотри как поведёт себя алгоритм
есть смысл подправить на
until i >= Memo1.Lines.Count-1;
лучше [18]
TUser (2004-10-01 16:27:00) [3]
> А вообще нужно именно удаление из TStringlist.
1. Копировать в какую-нибудь новую структуру данных. При копировании каждой новой строки - проверять, есть ли она уже там. Т.о. требует уметь быстро вставлять и находить - см. такие структуры, как например хеш-таблицы, нагруженные деревья, и пр. и пр.
2. Отсортировать (квиком) список, затем пройтись по нему и проверять на равенство с предыдущей строкой. Если строка новая - кописровать ее в новую структуру.
Sandman25 (2004-10-01 16:19:00) [4]MemoLines := Memo.Lines;
for I := MemoLines.Count-2 downto 0 do
if MemoLines[I] = MemoLines[I + 1] then
MemoLines.Delete(I);
begin...end (2004-10-01 16:08:00) [5]
> [16] default © (01.10.04 15:43)
> until i > Memo1.Lines.Count-1;
until i =Memo1.Lines.Count-1;
:-)
default (2004-10-01 15:43:00) [6]сори, поторопился я здорово
вот такой код будет работать
procedure TForm1.Button1Click(Sender: TObject);
var
i: Cardinal;
begin
i := 0;
repeat
while (i < Memo1.Lines.Count-1) and
(Memo1.Lines[i] = Memo1.Lines[i+1]) do Memo1.Lines.Delete (i+1);
Inc(i);
until i > Memo1.Lines.Count-1;
end;
begin...end (2004-10-01 15:21:00) [7]
> [4] begin...end © (01.10.04 14:51)
Ошибся, блин...
> List.Duplicates := dupAccept;
List.Duplicates := dupIgnore;
default (2004-10-01 15:20:00) [8]for i := 1 to Length(SList)-1 do
while (i+1 <= Length(SList) and (SList[i+1] = SList[i])
then Delete(i+1)
лучше так чем было
default (2004-10-01 15:17:00) [9]gid © (01.10.04 15:07) [11]
может что-то вроде?
i := 1;
repeat
S := SList[i];
while (i < Length(SList)) and (SList[i+1] = S)
then SList.Delete(i+1);
Inc(i);
until i < Length(SList);
begin...end (2004-10-01 15:09:00) [10]
> [11] gid © (01.10.04 15:07)
Ну если ты ручками удалять будешь, на фига тогда сортировка?
> я думаю мож сам поиск и удаление в цикл загнать
И в чём проблема?
gid (2004-10-01 15:07:00) [11]>>>default © (01.10.04 15:04) [10]
Сортировка само сабой я думаю мож сам поиск и удаление в цикл загнать.
default (2004-10-01 15:04:00) [12]begin...end © (01.10.04 14:59) [8]
нет, в огород таких вопросов
правда вопрос изменился как вижу
gid © (01.10.04 15:00) [9]
если список не отсортирован то наверно лучше осортировать перед такой операцией
gid (2004-10-01 15:00:00) [13]>>>default © (01.10.04 14:56) [7]
смотри gid © (01.10.04 14:51) [5] строка 5 "А вообще нужно именно удаление из TStringlist."
begin...end (2004-10-01 14:59:00) [14]
> [7] default © (01.10.04 14:56)
> когда на такие вопросы отвечают, авторы сообр-ют опы да
> чё я там буду хелп рыть спрошу на форуме
В мой огород, надо понимать?
default (2004-10-01 14:56:00) [15][2]
точного названия не монил помнил что что-о вроде DupIgnore
проблема не то что мне в лом, проблема глуюже
когда на такие вопросы отвечают, авторы сообр-ют опы да чё я там буду хелп рыть спрошу на форуме отсюда процент вопросов "хелповских" растёт уровень форума падает
gid (2004-10-01 14:53:00) [16]>>begin...end © (01.10.04 14:51) [4]
спасибо, ща буду пробовать.
gid (2004-10-01 14:51:00) [17]>>>default © (01.10.04 14:48) [3]
А тебе,че, трудно подсказать.
------------------------------
А вообще нужно именно удаление из TStringlist.
begin...end (2004-10-01 14:51:00) [18]
> [2] gid © (01.10.04 14:44)
List.Sorted := True;
List.Duplicates := dupAccept;
> их ведь четыре
Не угадал.
default (2004-10-01 14:48:00) [19]gid © (01.10.04 14:44) [2]
хелп на что?
gid (2004-10-01 14:44:00) [20]>>>>begin...end
Имееш ввиду перед заполнением TStringlist установить параметр Duplicates, но в какое состояние, их ведь четыре.