Форум: "Начинающим";
Текущий архив: 2014.12.21;
Скачать: [xml.tar.bz2];
Внизудалить из списка не дубликаты Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.002 c