【发布时间】:2010-10-06 04:37:43
【问题描述】:
我需要知道字符串中的所有字符是否相等(由相同的字符组成)。该函数必须返回真或假,具体取决于字符串的所有元素是否等于特定字符。
我编写了这个运行良好的函数,但我正在寻找更优化(最快)的解决方案,字符串可以有数千个字符。
function AllElementsAreEqual(Element:Char;Str:String):Boolean;
var
i : Integer;
begin
Result:=True;
if Str<>'' then
for i:=1 to Length(Str) do
if Str[i]<>Element then
begin
Result:= False;
exit;
end;
end;
更新
最后使用 Barry Kelly Suggestion 并添加inline 指令,性能明显提升。
function AllElementsAreEqual(Const Element:Char;Str:String):Boolean;inline;
type
ArrayInt = Array of Integer;
var
i : Integer;
Delta: Integer;
List : ArrayInt;
Test : Integer;
begin
Result:=True;
Delta:=(Length(Str) mod 4);
if Delta<>0 then
Str:=Str+StringOfChar(Element,4-Delta);
Test:=Ord(Element) + Ord(Element) shl 8 + Ord(Element) shl 16 + Ord(Element) shl 24;
List:=ArrayInt(@(Str[1]));
for i:=0 to ((Length(Str) div 4)-1) do
if List[i]<>Test then
begin
Result:=False;
exit;
end;
end;
更新 2
很抱歉,我发布了解决方案的旧实现(带有错误),现在已修复。 感谢 The_Fox 为 Barry 建议创建更好的实现。
【问题讨论】:
-
为什么不使用“===”三元组,这就是它的用途。比较是否绝对 = to。检查数据类型以及字符
-
@Val,Delphi 什么时候有“===”?您是否将 Delphi 与 JavaScript 混淆了?
-
糟糕,我在想别的东西……