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