Форум: "Основная";
Текущий архив: 2004.07.25;
Скачать: [xml.tar.bz2];
ВнизУдаление дубликатов с подсчетом повторов. Найти похожие ветки
← →
Pavelkq (2004-07-09 06:37) [0]Здравствуйте! Имею заполненный и упорядоченный TStringList. Нужно из него данные записать в массив, чтобы дубликаты исчезли, но количество повторов тоже занеслось в массив (именно поэтому я не использую встроенную функцию удаления дубликатов).
Реализовал циклическим сравнением текущего значения с последующим. Если они равны, то счетчик увеличивается. Если нет, то текущее значение вместе со счетчиком заносится в массив.
Проблема возникает на последнем значении. Ведь его нельзя сравнить с последующим, т.к. его нет. Приходится его сочинять, т.е. искуственно добавлять.
Есть ли другой алгоритм такой процедуры?
← →
MBo © (2004-07-09 06:44) [1]в цикле - вот встал ты на какую-то новую строку, записал ее, сделал счетчик 1, идешь дальше, инкрементируя счетчик, пока строка не изменится или не достигнешь конца - тогда записываешь счетчик. вроде бы никаких проблем не видно.
← →
Denisww © (2004-07-09 06:48) [2]..если упорядоченно
k:=0;
for i:=0 to 10 do begin
if (i>0)and(s[i-1]=s[i]) then continion;
a[k]:=s[i];inc(k)
End;
← →
Pavelkq (2004-07-09 06:49) [3]Ага, т.е. сохранить во временную переменную предыдущее значение (или прямо из массива)? Так можно:-) Не проснулся еще. Спасибо!
← →
Pavelkq (2004-07-09 06:57) [4]Ах, нет, тогда проблемы возникнут на первом элементе массива. Он же пустой. Разве что предустановить его в первое значение TStringListа, а потом цикл начать снова с нуля.
[2]-теоретически, да. Однако, в первом же проходе при i=0 получится s[i-1]=s[-1], что однозначно будет ошибкой.
← →
MBo © (2004-07-09 07:07) [5]Если тебе это нужно для работы, то временно оставь ее, возьми учебник и задачник какого-нибудь программистского колледжа, например, по паскалю и тщательно все прорешай, не пропуская ни одной задачи, даже типа "вывести все нечетные двузначные числа" или "объединить два возрастающих массива из 5 элементов в один возрастающий из 10 элементов" Элементарные задачи требуют элементарной здравой логики и некоторого количества упражнений.
Иначе все постоянно будет сводиться к
>тогда проблемы возникнут на первом элементе массива
или
>TStringList болеет. Как вылечить? (
хотя лечить нужно совсем не TStringList.
← →
Pavelkq (2004-07-09 07:18) [6]С задачником, Вы правы. Знаний не достаточно. Но для того и общение, чтобы помочь друг другу. Задача простая. Я ее решил, но хотелось бы изящно это сделать!
А с TStringList Вы не правы. Проблема действительно была. Это уже не порвое чудо, которое я встречал в Дельфи. Например, при вызове DLL у меня вдруг самопроизвольно менялись значения переменных типа BOOLEAN и BYTE. Но там я грешил на DLL, т.к. он сторонней разработки.
Чтобы примерно оценить задачу, часть старого кода можно посмотреть тут http://delphimaster.net/view/1-1088672516/
← →
Думкин © (2004-07-09 07:23) [7]> [6] Pavelkq (09.07.04 07:18)
> Это уже не порвое чудо, которое я встречал в Дельфи.
Поверьте, чем больше вы будете работать с Дельфи и чем быстрее последуете совету, тем быстрее у вас начнет уменьшаться количество чудес и т.п.
Чем дольше занимаешься программированием, тем с большей легкостью приписываешь ошибки себе и искать их начинаешь у себя вначале, а не только в Дельфи или в "Windows must die". Удачи. :)
← →
Denisww © (2004-07-09 11:09) [8]ты не понял
первый элемент он ие сть первый
a[0]:=s[0];k:=1;
for i:=1 to 10 do begin
if s[i-1]<>s[i] then begin a[k]:=s[i];inc(k)end
← →
Anatoly Podgoretsky © (2004-07-09 11:27) [9]Это не первое чудо, которое мы встречаем здесь
← →
Erik1 (2004-07-09 14:12) [10]Да тяжко тебе придется, сначала надо несколько лет набирать опыт,чтобы чудеса прекратились. Да и потом просто будеш знать, что баги в коде есть, но лучше их нетрогать.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.07.25;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.035 c