掩码比对!求算式(50分)

  • 主题发起人 主题发起人 DaChu
  • 开始时间 开始时间
D

DaChu

Unregistered / Unconfirmed
GUEST, unregistred user!
有一个手机号的字符串myMobileNo: 13932145678
有一个事先定义好的掩码maskcode:???3??4???8
?:代表任意数字

两个字符串进行比对:对于?的位置地方不做比对,
只比对非?的数字,如果对应位置上的数字一致,
我就认为两个字符串相等,

我目前使用的方法是:
//----------------------code begin----------

sign=true;

for i:= 1 to 11 do
begin
if makscode <> '?' then
begin
if maskcode <> myMobileNo then
begin
sign = false;
break;
end;
end;
end;

if sign then
showMessage('same')
else
showMessage('disaffinity')

//-------------------code end----------

有没有更好的方法? 我的myMobileNo数据量比较大,希望能够缩短比对时间
 
SELECT * FROM Table
WHERE SubString( myMobileNo , 3 ,1 ) = '3' and SubString( myMobileNo , 6 ,1 ) = '6' and SubString( myMobileNo , 8 , 1 ) = '8'
 
用正则表达式判断比较方便灵活
 
不好意思!有点没有说明,通配符的位置和数字的位置和个数都是随机的,没有办法直接定位的.
 
??9???40000
??8???41111
??7???42222
??6???43333
??5???43456
??????4?918
??????4?999
??????4??4?
??????4??58
??????4??66
??????4??68
类似上面的maskcode还很多

myMobileNo的数量也有10多万,要从中找出与maskcode相符的来
 
那也好办啊。你动态生成SQL语句的Where部分或者正则表达式就可以了。。
 
经过测试,楼主的代码已经是最快得了(在我的机器上千万次才 0.7 秒!)对于上述硬编码 native code 我想 SQL 或 regexpr 绝对达不到这个速度。
不过如果一般复杂的匹配(支持 ? 和 * 的),可以使用 Delphi 的 Masks 单元的例程:

function MaskCode(const maskcode, myMobileNo: string): Boolean;
var
I: Integer;
begin
Result := False;
for i:= 1 to 11 do
if (maskcode <> '?') and (maskcode <> myMobileNo) then
begin
Result := False;
Break;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
dt: TDateTime;
I: Integer;
begin
with TMask.Create('???3??4???8') do
try
dt := Now;
for I := 0 to 100000 do
Matches('13932145678');
ShowMessage(FormatFloat('0.0000', 24 * 60 * 60 * (Now - dt)));
finally
Free;
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
dt: TDateTime;
I: Integer;
begin
dt := Now;
for I := 0 to 1000000 do
MaskCode('???3??4???8', '13932145678');
ShowMessage(FormatFloat('0.0000', 24 * 60 * 60 * (Now - dt)));
end;
 
function Check(PSource, PMask: PChar): Boolean;
var
i: Integer;
begin
for i := 10 downto 0 do //前两位不用MASK的话 0 -> 2
if (PMask <> '?') and (PMask <> PSource) then
begin
Result := True;
Exit;
end;
Result := False;
end;
 
谢谢各位,看来目前只能采用这种方式了
 
后退
顶部