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

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

Удаление дубликатов с подсчетом повторов. [D6, WinXP]


Pavelkq ©   (2004-07-09 06:37:00) 

Здравствуйте! Имею заполненный и упорядоченный TStringList. Нужно из него данные записать в массив, чтобы дубликаты исчезли, но количество повторов тоже занеслось в массив (именно поэтому я не использую встроенную функцию удаления дубликатов).
 Реализовал циклическим сравнением текущего значения с последующим. Если они равны, то счетчик увеличивается. Если нет, то текущее значение вместе со счетчиком заносится в массив.
 Проблема возникает на последнем значении. Ведь его нельзя сравнить с последующим, т.к. его нет. Приходится его сочинять, т.е. искуственно добавлять.
 Есть ли другой алгоритм такой процедуры?


Erik1   (2004-07-09 14:12:00) [1]

Да тяжко тебе придется, сначала надо несколько лет набирать опыт,чтобы чудеса прекратились. Да и потом просто будеш знать, что баги в коде есть, но лучше их нетрогать.


Anatoly Podgoretsky   (2004-07-09 11:27:00) [2]

Это не первое чудо, которое мы встречаем здесь


Denisww   (2004-07-09 11:09:00) [3]

ты не понял
первый элемент он ие сть первый

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


Думкин   (2004-07-09 07:23:00) [4]

> [6] Pavelkq   (09.07.04 07:18)
> Это уже не порвое чудо, которое я встречал в Дельфи.

Поверьте, чем больше вы будете работать с Дельфи и чем быстрее последуете совету, тем быстрее у вас начнет уменьшаться количество чудес и т.п.
Чем дольше занимаешься программированием, тем с большей легкостью приписываешь ошибки себе и искать их начинаешь у себя вначале, а не только в Дельфи или в "Windows must die". Удачи. :)


Pavelkq   (2004-07-09 07:18:00) [5]

С задачником, Вы правы. Знаний не достаточно. Но для того и общение, чтобы помочь друг другу. Задача простая. Я ее решил, но хотелось бы изящно это сделать!
 А с TStringList Вы не правы. Проблема действительно была. Это уже не порвое чудо, которое я встречал в Дельфи. Например, при вызове DLL у меня вдруг самопроизвольно менялись значения переменных типа BOOLEAN и BYTE. Но там я грешил на DLL, т.к. он сторонней разработки.
 Чтобы примерно оценить задачу, часть старого кода можно посмотреть тут http://www.delphimaster.ru/cgi-bin/forum.pl?id=1088672516&n=0


MBo   (2004-07-09 07:07:00) [6]

Если тебе это нужно для работы, то временно оставь ее, возьми учебник и задачник какого-нибудь программистского колледжа, например, по паскалю и тщательно все прорешай, не пропуская ни одной задачи, даже типа "вывести все нечетные двузначные числа" или "объединить два возрастающих массива из 5 элементов в один возрастающий из 10 элементов" Элементарные задачи требуют элементарной здравой логики и некоторого количества упражнений.

Иначе все постоянно будет сводиться к
>тогда проблемы возникнут на первом элементе массива
или
>TStringList болеет. Как вылечить? (
хотя лечить нужно совсем не TStringList.


Pavelkq   (2004-07-09 06:57:00) [7]

Ах, нет, тогда проблемы возникнут на первом элементе массива. Он же пустой. Разве что предустановить его в первое значение TStringListа, а потом цикл начать снова с нуля.
 [2]-теоретически, да. Однако, в первом же проходе при i=0 получится s[i-1]=s[-1], что однозначно будет ошибкой.


Pavelkq   (2004-07-09 06:49:00) [8]

Ага, т.е. сохранить во временную переменную предыдущее значение (или прямо из массива)? Так можно:-) Не проснулся еще. Спасибо!


Denisww   (2004-07-09 06:48:00) [9]

..если упорядоченно
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;


MBo   (2004-07-09 06:44:00) [10]

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


Наверх

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