各位帮忙啊(100分)

  • 主题发起人 主题发起人 code_er
  • 开始时间 开始时间
C

code_er

Unregistered / Unconfirmed
GUEST, unregistred user!
有一个字符串:如“1 12 2 4 56 12 3 7 11 7 ”, 如何写一过程把之间重复的
字符去掉,即去掉后剩下“1 2 4 56 3 11 ”
谢谢大家!!
 
如果不怕慢,可以用POS() DELETE() COPY()配合使用 在循环中
 
function GetStr: string;
var
I: Integer;
S1: string;
S: string;
begin
S := '1 12 2 4 56 12 3 7 11 7 ';
S1 := '';
Result := '';
for I := 1 to Length(S) do
if (S = ' ') or (Pos(S, S1) = 0) then
begin
S1 := S1 + S;
Result := Result + S;
end;
end;
 
var
s,ts,rs:string;
i:integer;
begin
s:='1 12 2 4 56 12 3 7 11 7 ';
for i:=1 to length(s) do
begin
ts:=s;
if (ts=' ') or (pos(s,rs)<=0) then rs:=rs + ts;
end;
result:=ts;
end;
 
FUNCTION FtString(vStr:STRING):STRING;
VAR lList:TStringList; iCount,k,m:INTEGER; sCell:STRING;
BEGIN
lList:=TStringList.Create; sCell:='';
FOR k:=1 TO LENGTH(vStr) DO
BEGIN
IF vStr[k]=' ' THEN BEGIN IF sCell='' THEN Continue; lList.Add(sCell); sCell:=''; END;
sCell:=sCell+vStr[k];
END;
FOR k:=0 TO lList.Count-1 DO
BEGIN
sCell:=lList[k]; iCount:=0;
IF sCell[1]='#' THEN Continue;
FOR m:=k TO lList.Count-1 DO BEGIN IF sCell=lList[m] THEN Inc(iCount); END;
IF iCount<=1 THEN Continue;
FOR m:=k TO lList.Count-1 DO BEGIN IF sCell=lList[m] THEN lList[m]:='#'+lList[m]; END;
END;
Result:='';
FOR k:=0 TO lList.Count-1 DO
BEGIN
sCell:=lList[k];
IF sCell[1]='#' THEN Continue;
Result:=Result+' '+lList[k];
END;
lList.Free;
END;
不要告诉我不行!
 
谢谢你们啊,我试试,先
正确的话一定加分!
 
function cutstr(s:string):string;
var
i,j:integer;
flag:boolean;
strlist:tstringlist;
begin
strlist:=tstringlist.Create;
strlist.Clear;
s:=trim(s)+' ';
while length(s)>0 do
begin
strlist.Add(copy(s,1,pos(' ',s)-1));
s:=copy(s,pos(' ',s)+1,length(s));
end;
for i:=0 to strlist.Count-1 do
begin
flag:=true;
for j:=0 to strlist.Count-1 do
if (i<>j) and (strlist.strings=strlist.strings[j]) then
flag:=false;
if flag then
s:=s+' '+strlist.strings;
end;
result:=s;
end;
楼上的算法比我的好

 
to :ligia
不对呀
试试
‘1 1 ’
‘1 1 1 ’
 
to:caffen
也不对呀
试试
‘1 1 1’
 
to:Awen.ZW.Yang
也不对呀
请试试:
‘1 1 1 ’
怎么办呢?
 
不好意思!!
我的要求是:
有一个字符串:如“1 12 2 4 56 12 3 7 11 7 ”, 如何写一过程把之间重复的
字符去掉,即去掉后剩下“1 2 4 56 3 11 ”
 
FUNCTION FtString(vStr:STRING):STRING;
VAR lList:TStringList; iCount,k,m:INTEGER; sCell:STRING;
BEGIN
lList:=TStringList.Create; sCell:='';
FOR k:=1 TO LENGTH(vStr) DO
BEGIN
IF vStr[k]=' ' THEN BEGIN IF TRIM(sCell)='' THEN Continue; lList.Add(sCell); sCell:=''; END;
sCell:=sCell+vStr[k];
END;
FOR k:=0 TO lList.Count-1 DO lList[k]:=TRIM(lList[k]);
FOR k:=0 TO lList.Count-1 DO
BEGIN
sCell:=TRIM(lList[k]); iCount:=0;
IF sCell[1]='#' THEN Continue;
FOR m:=k TO lList.Count-1 DO BEGIN IF sCell=lList[m] THEN Inc(iCount); END;
IF iCount<=1 THEN Continue;
FOR m:=k TO lList.Count-1 DO BEGIN IF sCell=lList[m] THEN lList[m]:='#'+lList[m]; END;
END;
FormMain.Memo1.Lines:=lList;
Result:='';
FOR k:=0 TO lList.Count-1 DO
BEGIN
sCell:=lList[k];
IF sCell[1]='#' THEN Continue;
Result:=Result+' '+lList[k];
END;
END;
不好意思忘了去空格
 
谢谢ligia
不过你没有全明白我的意思
我的意思是:去掉重复的字符
如:‘1 1 1 ’
我想得到:‘1 ’
 
procedure TForm1.BitBtn1Click(Sender: TObject);
var l_str,subStr,mStr,dStr : String;
begin
l_str := ' 1 1 1 ';
dStr := '';
while Pos(' ',l_str) > 0 do
begin
subStr := Copy(l_str,1,Pos(' ',l_str));
mStr := ' '+l_str;
delete(l_str,1,Pos(' ',l_str));
if Pos(' '+subStr,l_str) > 0 then
begin
l_str := StringReplace(mStr,' '+subStr,' ',[rfReplaceAll, rfIgnoreCase]);
if Pos(' ',l_str) = 1 then l_str :=StringReplace(l_Str,' ','',[rfReplaceAll, rfIgnoreCase])
end
else
dStr := dStr + subStr;
end;
ShowMessage(dStr);
end;//空格问题
 
“1 12 2 4 56 12 3 7 11 7 ”, 怎么出现 “1 2 4 56 3 11 ”
那 7 不要了. 说明白!
 
FUNCTION FtString(vStr:STRING):STRING;
VAR lList:TStringList; iCount,k,m:INTEGER; sCell:STRING;
BEGIN
lList:=TStringList.Create; sCell:='';
FOR k:=1 TO LENGTH(vStr) DO
BEGIN
IF vStr[k]=' ' THEN BEGIN IF TRIM(sCell)='' THEN Continue; lList.Add(sCell); sCell:=''; END;
sCell:=sCell+vStr[k];
END;
FOR k:=0 TO lList.Count-1 DO lList[k]:=TRIM(lList[k]);

FOR k:=0 TO lList.Count-1 DO
BEGIN
sCell:=TRIM(lList[k]); iCount:=0;
IF sCell[1]='#' THEN Continue;
FOR m:=k TO lList.Count-1 DO BEGIN IF sCell=lList[m] THEN Inc(iCount); END;
IF iCount<=1 THEN Continue;
FOR m:=k+1 TO lList.Count-1 DO BEGIN IF sCell=lList[m] THEN lList[m]:='#'+lList[m]; END;
END;
FormMain.Memo1.Lines:=lList;
Result:='';
FOR k:=0 TO lList.Count-1 DO
BEGIN
sCell:=lList[k];
IF sCell[1]='#' THEN Continue;
Result:=Result+' '+lList[k];
END;
END;
你后边的要求.
 
这伙计问题描述不清,把大家弄的团团转,不玩了!
 
下面的算法可以实现效果,但效率不是很好。

function Test(str: string):string;
var
s: TStringList;
i, j: integer;
begin
result := '';
s := TStringList.Create;
s.CommaText := str;
for i := 0 to s.Count-1 do
begin
for j := 1 to s.Count-1 do
begin
if (i<>j) and (s.Strings = s.Strings[j]) then
break
end;
if j = s.Count then
result := result + ' '+s.Strings;
end;
delete(result,1,1);
s.Free;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
str: string;
begin
str := '1 12 2 4 56 12 3 7 11 7';
showmessage(test(str));
end;
 

Similar threads

回复
0
查看
1K
不得闲
回复
0
查看
848
不得闲
D
回复
0
查看
767
DelphiTeacher的专栏
D
D
回复
0
查看
809
DelphiTeacher的专栏
D
D
回复
0
查看
639
DelphiTeacher的专栏
D
后退
顶部