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

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

удалить из списка не дубликаты


TheOwl ©   (2013-12-05 10:49:00) 

Есть отсортированный список (TStringList) значений:

1
1
2
3
3
4
5

Задача: оставить в списке только цепочки значений (т.е. удалить не дубликаты). Как максимально быстро это сделать (за один проход)?


turbouser   (2013-12-05 18:13:00) [1]

Дожили...


DevilDevil   (2013-12-05 17:28:00) [2]

> TheOwl   (05.12.13 10:49)

удалить за один проход можно.
но связываться с TStringList, и TList - не очень быстро
а у тебя ещё и судя по всему строки

поэтому уточни, насколько быстро тебе нужно
и какие типы используются для списка/элемента


Sha   (2013-12-05 16:30:00) [3]

попытка номер 2

 n:=0;
 for i:=sl.Count-2 downto 0 do
   if sl[i]=sl[i+1] then begin; inc(n); sl.Delete(i+1); end
   else if n>0 then begin; n:=0; sl.Delete(i+1); end;    
 if (n>0) and (sl.Count>0) then sl.Delete(0);


Sha   (2013-12-05 16:18:00) [4]

не то удалил ))


Sha   (2013-12-05 16:15:00) [5]

 n:=0;
 for i:=sl.Count-2 downto 0 do
   if sl[i]=sl[i+1] then inc(n)
   else if n>0 then n:=0
   else sl.Delete(i+1);
 if (n=0) and (sl.Count>0) then sl.Delete(0);


Плохиш   (2013-12-05 12:31:00) [6]


 int[] arr = {1, 1, 2, 3, 3, 4, 5};
 arr = arr.Where(a => (arr.Where(a2 => a2 == a).Select( a2 => a2).Count()) > 1).Select(a => a).ToArray();

:-))


jack128_   (2013-12-05 11:59:00) [7]


> А как?

Если список сортированный, то никак.


Медвешоног Порожог   (2013-12-05 11:38:00) [8]

взять текст от стринглиста и регуляркой зареплейсить


Ega23   (2013-12-05 11:37:00) [9]


> [9]?


А как?


brother   (2013-12-05 11:33:00) [10]

[9]?


Ega23   (2013-12-05 11:32:00) [11]


> else inc(n)


С конца надо идтить. Посмотри реализацию Delete.


brother   (2013-12-05 11:30:00) [12]

> иду с конца

надо сначала, ибо при удалении могут получиться еще цепочки или этого не надо?


brother   (2013-12-05 11:29:00) [13]

те
if m[n]<>m[n-1] and m[n]<>m[n+1] then
 удалить m[n]
else inc(n)


TheOwl   (2013-12-05 11:29:00) [14]


> идем по списку, если текущее значение не равно предыдущему
> или следующему, то удаляем его...


ну я вообщем-то так и сделал. иду с конца, текущее значение сравниваю с предыдущим, если не равно, удаляю текущее.


Ega23   (2013-12-05 11:28:00) [15]

for i := list.Count - 1 downto 0 do
begin
 if твоё_условие then
   Delete(i);
end;


Ega23   (2013-12-05 11:27:00) [16]


> идем по списку, если текущее значение не равно предыдущему
> или следующему, то удаляем его...


Угу. Только во избежание - идём с конца списка.


TheOwl   (2013-12-05 11:27:00) [17]


> "удалить не дубликаты" это что остаться то должно? 2, 4
> и 5 ?


остаться должно:

1
1
3
3


Ega23   (2013-12-05 11:27:00) [18]


> "удалить не дубликаты" это что остаться то должно? 2, 4
> и 5 ?

скорее, 1, 1, 3, 3


brother   (2013-12-05 11:26:00) [19]

идем по списку, если текущее значение не равно предыдущему или следующему, то удаляем его...


Palladin   (2013-12-05 11:22:00) [20]

"удалить не дубликаты" это что остаться то должно? 2, 4 и 5 ?


Наверх

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