![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
удалить из списка не дубликаты
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 ?