| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Центр помощи > Проблема со строкой |
| Автор: Гость_angelofdeath 19.7.2005, 10:44 |
| Привет всем. Есть строка Н1 Г О Н1 В4 С …….. ИТД примерно 1500 символов Мне надо исключить повторяющиеся символы ....... строка в мемо |
| Автор: Bes 19.7.2005, 11:22 |
| т.е. чтобы каждого символа было по одному или убрать одинаковые символы идущие друг за другом? |
| Автор: angelofdeath 19.7.2005, 11:58 |
| Да , каждый символ в единствнном числе |
| Автор: Bes 19.7.2005, 12:18 |
| тогда алгоритм такой начальная строка s1 получаемая s2 и перебирая первую по одному символу делаем следующее смотрим (pos-ом) есть ли во второй такой символ и если нет то добавляем все! |
| Автор: RaIDeR 19.7.2005, 12:31 |
| Я что-то не понял на чем ты пишешь, а в данном топике кликая на "Код" он почему-то не для Delphi, а для Cpp ... ну а на дельфи это выглядет так [code=delphi] procedure TForm1.Button1Click(Sender: TObject); var S: String; C: Char; I, J: Integer; begin S := 'aabbcc'; for I := 0 to Length(S) do begin J := Pos(S[I + 1], S); C := S[J]; Delete(S, J, 1); while Pos(C, S) < 0 do Delete(S, Pos(C, S), 1); end; memo1.Lines.Add(S); end; [/code |
| Автор: Bes 19.7.2005, 12:44 |
| Зачем постоянно модифицировать строку да и pos вроде бы 0 возвращает когда не находит ничего т.к. строки нумеруются с 1?????? |
| Автор: RaIDeR 19.7.2005, 12:48 |
| Да Я тут побыстрому набрасал .... даже не проверял, но уверен что это работает |
| Автор: Bes 19.7.2005, 12:51 |
| думаю нет |
| Автор: Akina 19.7.2005, 13:22 | ||
|
| Автор: RaIDeR 19.7.2005, 14:28 |
| procedure TForm1.Button1Click(Sender: TObject); var I: Integer; S1, S2: String; begin S1 := 'aacbdbcxcvbfhdfyhevcbsfgsdrfw3tkjlcacbd11132213'; S2 := ''; for I := 1 to Length(S1) do if Pos(S1[I], S2) = 0 then S2 := S2 + S1[I]; memo1.Lines.Add(S2); end; |
| Автор: mvdr 20.7.2005, 08:57 | ||
|
| Автор: angelofdeath 20.7.2005, 11:11 |
| Все ребята понял :-) спосибо большое |
| Автор: angelofdeath 20.7.2005, 17:41 |
| Народ , а если вот такая строчка разделенная пробелом В1 П2 О1 В1 Г П2 и надо сравнить и удалить повторяющтеся символы .......... |
| Автор: Akina 20.7.2005, 17:52 |
| angelofdeath Символы или группы символов, разделенных пробелами? |
| Автор: Yanis 21.7.2005, 00:13 |
| 2 angelofdeath А пробел, в таком случае тоже повторяющийся символ или нет? |
| Автор: maxim1000 21.7.2005, 09:50 |
| кстати, если сделать массив из 255 bool'ов и хранить в нем "встречался символ или нет", получится быстрее |
| Автор: Akina 21.7.2005, 10:00 | ||
| maxim1000 имеешь в виду
? В принципе верно, при условии что речь идет о повторении БАЙТОВ - что последнее время ставится под сомнение... автора бы... |
| Автор: angelofdeath 21.7.2005, 10:53 |
| Да 'В1 П2 О1 В1 Г П2 ' - вот такая строка , и сравнить надо как раз группу символов разделенных пробелом пробел повторяется...........и удалить повторяющийся символ (язык делфа) Добавлено @ 10:58 Да стринговый массив можносделать var o1:array of string; begin s:=Edit7.Text; Repeat setlength(o1,length(o1)+1); if pos (' ',s)>0 then begin o1[length(o1)-1]:=trim((copy(s,1,pos(' ',s)))); s:=copy(s,pos(' ',s)+1,length(s)); end else begin o1[length(o1)-1]:=trim(s); break; end; until False; end; тока - как улаить из массива символы повторяющиеся я тоже не знаю , и молучается более грамоздко |
| Автор: Akina 21.7.2005, 11:18 |
| angelofdeath Пихаем строку в TStringList, заменяем пробелы на #13#10 (полчается массив строк), обрабатываем строки по принципу: берем очередную строку, сравниваем с предыдущими. Если не нашлось - берем следующую, если нашлось - на ее место пишем последнюю (кол-во строк при этом уменьшается на 1)... т.е. гоним 2 указателя - на проверяемый элемент и на конец массива элементов до тех пор пока они не сравняются. Потом обратная замена переводов строки на пробелы. Можно даже проще - заставить TStringList после разбиения отсортироваться, тогда сравнивать придется только последующий с предыдущим, а не со всеми предыдущими... |
| Автор: angelofdeath 21.7.2005, 13:51 |
| А текст можешь набросать , просто если делать с моссивом , то при проверке у меня возникает куча ошибок........... |
| Автор: Akina 21.7.2005, 14:16 | ||
Что-нить типа:
Т.к. я на Дельфе не пишу - проверяй сам. |
| Автор: angelofdeath 22.7.2005, 00:29 |
| Все шикарно , большое тебе спасибо , я тупил .... не подумал о repeat , - совсем этот цикл из башки вылетел :-) |