Delphi和SQL语言中最大匹配值的函数分别是什么?(20分)

  • 主题发起人 主题发起人 Jao
  • 开始时间 开始时间
J

Jao

Unregistered / Unconfirmed
GUEST, unregistred user!
比如说:
1234
1234690
应该是1234690与123469732最大匹配。
 
这么多天都没人理我,因为放假吗?给个变通的办法也行啊!
好,我再加100分,悬赏!
 
什么叫最大匹配值?
 
比如说两个表:
表一中有一条字符型记录:'1234567890'(str1)
表二中有两条字符型记录:'1234'(str2),'123456'(str3)
最大匹配就是说str2与str1有四个字符是相同的,而str3与str1有六个字符是相同的,所以在选择的时候要取出str3而不是str2.
 
怎么没人来?这个问题没解吗?
 
没见过这样的现成函数.
 
没有!
like ???
 
SQL Server函数
SOUNDEX(char_expr) 比较两个字符串的相似性后返回一个四位数代码。
DIFFERENCE(char_expr1,char_expr2) 比较两个字符串,返回值从0到4,4为最优匹配。
Delphi没有可用的函数,我写了一个:
function MaxMatchStr(DestStr:String;Strs:array of String):String;
var
I:Integer;
begin
Result:='';
for I:=1 to Length(Strs) do
//如果与目标匹配
if (Pos(Strs,DestStr)>0) and
//而且比现在找到的结果更长
(Length(Strs)>Length(Result)) then
//替换当前结果
Result:=Strs;
end;

演示:
procedure TForm1.Button1Click(Sender: TObject);
begin
Caption:=MaxMatchStr('123456789',
['1',
'12',
'123',
'1234',
'12345',
'123456',
'1234567',
'12345678',
'123456789']);
end;
 
Function CompChar(Str1,Str2:String):integer;
var TempStr:String;
i,j:Integer;
Begin
result:=0;
if Length(str2)>Length(str1) then begin
tempstr:=str1;
str1:=str2;
str2:=tempstr;
end;
for i:=length(Str1) downto 1 do
for j:=1 to Length(Str1)-i+1 do
if (Pos(copy(Str1,j,i),Str2)>0)and(result<i) then result:=i;
end;
 
Function CompChar(Str1,Str2:String):integer;
var TempStr:String;
i,j:Integer;
Begin
result:=0;
if Length(str2)>Length(str1) then begin
tempstr:=str1;
str1:=str2;
str2:=tempstr;
end;
for i:=length(Str1) downto 1 do
for j:=1 to Length(Str1)-i+1 do
if (Pos(copy(Str1,j,i),Str2)>0)and(result<i) then result:=i;
end;

 
Function CompChar(Str1,Str2:String):integer;
var TempStr:String;
i,j:Integer;
Begin
result:=0;
if Length(str2)>Length(str1) then begin
tempstr:=str1;
str1:=str2;
str2:=tempstr;
end;
for i:=length(Str1) downto 1 do
for j:=1 to Length(Str1)-i+1 do
if (Pos(copy(Str1,j,i),Str2)>0)and(result<i) then result:=i;
end;
对不起,由于小于号没有写上,所以发了三遍
 
Function CompChar(Str1,Str2:String):integer;
var TempStr:String;
i,j:Integer;
Begin
result:=0;
if Length(str2)>Length(str1) then begin
tempstr:=str1;
str1:=str2;
str2:=tempstr;
end;
for i:=length(Str1) downto 1 do
for j:=1 to Length(Str1)-i+1 do
if (Pos(copy(Str1,j,i),Str2)>0)and(result<i) then result:=i;
end;
对不起,由于小于号没有写上,所以发了三遍
 
Jao ,这个问题结束吗?
 
对不起Jao , 我选错选项, 不小心把它结束了, 希望别介意.
 
后退
顶部