Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2014.12.21;
Скачать: CL | DM;

Вниз

удалить из списка не дубликаты   Найти похожие ветки 

 
TheOwl   (2013-12-05 10:49) [0]

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

1
1
2
3
3
4
5

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


 
Palladin ©   (2013-12-05 11:22) [1]

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


 
brother ©   (2013-12-05 11:26) [2]

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


 
Ega23 ©   (2013-12-05 11:27) [3]


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

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


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


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


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

1
1
3
3


 
Ega23 ©   (2013-12-05 11:27) [5]


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


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


 
Ega23 ©   (2013-12-05 11:28) [6]

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


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


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


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


 
brother ©   (2013-12-05 11:29) [8]

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


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

> иду с конца

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


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


> else inc(n)


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


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

[9]?


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


> [9]?


А как?


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

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


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


> А как?

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


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


 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();

:-))


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

 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);


 
Sha ©   (2013-12-05 16:18) [17]

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


 
Sha ©   (2013-12-05 16:30) [18]

попытка номер 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);


 
DevilDevil ©   (2013-12-05 17:28) [19]

> TheOwl   (05.12.13 10:49)

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

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


 
turbouser ©   (2013-12-05 18:13) [20]

Дожили...



Страницы: 1 вся ветка

Текущий архив: 2014.12.21;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.007 c
2-1386312700
Dmitry123
2013-12-06 10:51
2014.12.21
перевод координат


2-1385912465
Koudelka
2013-12-01 19:41
2014.12.21
DELPHI:запрет на внесение повторных данных в таблицу БД


15-1386965596
Jeer
2013-12-14 00:13
2014.12.21
Феномен Стругацких или..?


15-1400445002
Юрий
2014-05-19 00:30
2014.12.21
С днем рождения ! 19 мая 2014 понедельник


15-1400664566
Лактоза
2014-05-21 13:29
2014.12.21
CustomDrawTreeView.pas