Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Удаление повторений в TStringlist [D7, Win95/98, WinME, NT4, Win2k, WinXP]


Страницы:   1 2

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, но в какое состояние, их ведь четыре.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо