如何快速判断几个字符或数字中存在重复?(30分)

  • 主题发起人 主题发起人 L.Ming
  • 开始时间 开始时间
L

L.Ming

Unregistered / Unconfirmed
GUEST, unregistred user!
如何快速判断几个字符或数字中存在重复?
'A','B','B','C'
1,2,3,3
如何判断里面存在重复的字符或数据?
 
你所有的字符假设用Str1代替:
var
i,j:integer;
Str1:String;
begin
Str1:='ABBC';
for i:=0 to length(Str1)-2 do
begin
for j:=i+1 to length(Str1)-1 do
begin
if a=a[j] then
begin
showmessage('有重复字符串!');
break;
end else
showmessage('没有重复字符!');
end;
end;
end;

你所有的数字假设用Str2代替:
...(同上)...
 
//先排序,再比较就很快了:

var
i: Integer;
begin
with TStringList.Create do
try
Add('A');
Add('B');
Add('B');
Add('C');
Sort; //如果已排序,则不需调用 Sort;
for i := 1 to Count -1 do begin
if Strings[i -1] = Strings then begin
ShowMessage('有重复!');
Break;
end;
end;
finally
Free;
end;
 
用排序方法最快!
 
1.快速排序法
2.逐位比较是否相同
 
没有什么系统函数之类的吗?
 
来自:L.Ming, 时间:2006-6-26 8:12:57, ID:3481171
没有什么系统函数之类的吗?

不可能有的啊
 
没有的,呵呵,不要奢望所有的需求都由宝兰公司做好。
 
谁说没有?
 
把你所有的字符连成一个字符串
pos('3','1233')
就能得到2了
 
运行一下看看:
procedure TForm1.Button3Click(Sender: TObject);
var SL:TStringList;
S:String;
iPos:Integer;
begin
SL:=TStringList.Create;
SL.Add('A');
SL.Add('D');
SL.Add('C');
SL.Add('E');
SL.Add('B');
SL.Add('A');
SL.Add('B');
SL.Sorted:=True;
SL.Sort;
showmessage(SL.CommaText);
S:='B';//需要确认是否重复的字符串
SL.Sorted:=False; //防止如果重复查到的是最后出现的
iPos:=SL.IndexOf(S);
if iPos=-1 then
showmessage('不存在:'+S)
else if iPos=SL.Count-1 then
showmessage('没有重复:'+S)
else begin
if S<>SL[iPos+1] then
showmessage('没有重复:'+S)
else
showmessage('重复:'+S)
end;
end;
 
这个可能更好一点:
procedure TForm1.Button3Click(Sender: TObject);
var SL:TStringList;
S:String;
i,iPos:Integer;
begin
SL:=TStringList.Create;
SL.Add('A');
SL.Add('D');
SL.Add('C');
SL.Add('E');
SL.Add('B');
SL.Add('A');
SL.Add('B');
SL.Sorted:=True;
SL.Sort;
showmessage(SL.CommaText);
SL.Sorted:=False; //防止如果重复查到的是最后出现的
for i:=0 to SL.Count-1 do begin
S:=SL;//需要确认是否重复的字符串
iPos:=SL.IndexOf(S);
if iPos=-1 then
showmessage('不存在:'+S)
else if iPos=SL.Count-1 then
showmessage('没有重复:'+S)
else begin
if S<>SL[iPos+1] then
showmessage('没有重复:'+S)
else
showmessage('重复:'+S)
end;
end;
end;
 
LZ懒到家了,不可能什么都有系统API,郁闷
 
看到大家的方式,都是通过循环判断.
有没有更好的方法?
 
连循环都不用的话,解决这个问题是不可能的。。
 
不必要用循环吗?我有绝妙办法。有没有听说过文本引擎?将文本作为数据库,支持标准sql语句,那么你想想,一个 select count(textfield) as countStr from [a text file] group by textfield 不就得到所有重复的字符以及重复的次数吗?当然,字符少的话,还是用循环比较快,如果是成千上万的来比较,那用文本数据引擎吧。
以下是以前我用此方法对一文本文件进行处理的代码,要处理的文本是从EXCEL里导出来的一大批记录,虽然处理结果跟你要的不一样,但是对你会有用的。

filepath:=ExtractFilePath(Edit1.Text);
Filename:=ExtractFileName(Edit1.Text);

ConnectStr:='Microsoft.Jet.OLEDB.4.0;Data Source='+
filepath+';Extended Properties=text;Persist Security Info=False';
ADOConnection1.Provider:=ConnectStr;
ADOConnection1.LoginPrompt:=False;
ADOConnection1.Open;

ADOQuery2.SQL.Text:='Select cstr(phone) as [phone] from '+
'(select count(phone) as [ccc],phone as phone From '+Filename+
' group by phone)adc where ccc>1 and phone>0';
ADOQuery2.Open;

ADOQuery1.SQL.Text:='Select cstr(phone) as [phone] From '+Filename+
' where phone>0 group by phone';
ADOQuery1.Open;
 
呵呵~~~~都没有什么新意,和我当初的想法差不多,因为判断的次数比较多,本想找一个更快速的方法.结束问题了.
 
后退
顶部