Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > Проблема со строкой


Автор: Гость_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
Да Я тут побыстрому набрасал .... даже не проверял, но уверен что это работает smile

Автор: Bes 19.7.2005, 12:51
думаю нет

Автор: Akina 19.7.2005, 13:22
Код

Dim Str1 as string
Dim Str2 as string
dim i as integer

Str1="aassddffgg"

str2=""
for i = 1 to len(str1)
   if instr(str2, mid(str1, i, 1)) = 0 then
      str2 = str2 & mid(str1, i, 1)
   end if
next i
? str2
end

Автор: 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
Код

var i:integer
     S1,S2:string
begin
 S1:=edit1.Text;
 for i:=1 to Length(S1) do
  for j:=1 to Length(S2) do
   if copy(S1,i,1)<>copy(S2,j,1) then S2:=S2+copy(S1,i,1);
 Edit2.Text:=S2;
end;

Автор: 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'ов и хранить в нем "встречался символ или нет", получится быстрее smile

Автор: Akina 21.7.2005, 10:00
maxim1000
имеешь в виду

Код

for i = 1 to len(str)
   Presence(asc(mid(str,i))) = True
next


?

В принципе верно, при условии что речь идет о повторении БАЙТОВ - что последнее время ставится под сомнение... автора бы...

Автор: 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
Что-нить типа:

Код

var 
  t:TStringList; 
  s:String;
  i:Integer;

begin 
  s:='aa cb db cx cv bf hd fy he vc bs fg sd rf w3 tk jl ca cb d1 11 32 21 11';
  t:=TStringList.create;
  t.text:=stringReplace(s,' ',#13#10,[rfReplaceAll]);
  t.Sort=True;
  i=1;
  repeat
    if t[i]=t[i-1] then 
      begin
        t[i].Delete;
      end
    else
      begin
        i:=i+1;
      end;
  until i=t.Count;
  s:=stringReplace(t.text,#13#10,' ',[rfReplaceAll]);
  t.free; 
end.


Т.к. я на Дельфе не пишу - проверяй сам.

Автор: angelofdeath 22.7.2005, 00:29
Все шикарно , большое тебе спасибо , я тупил .... не подумал о
repeat , - совсем этот цикл из башки вылетел :-)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)