我需要知道字符串中的所有字符是否都相等(由同一字符组成)。该函数必须返回 true 或 false,具体取决于字符串的所有元素是否等于特定字符。
我编写的这个函数运行良好,但我正在寻找更优化(最快)的解决方案,字符串可以有数千个字符。
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;
UPDATE最后使用巴里·凯利建议并添加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;
UPDATE 2
很抱歉,我发布了解决方案的旧实现(有错误),现在已修复。
谢谢The_Fox更好地实施巴里建议。
您可以考虑创建一个Integer
值与Element
重复 4 次(因为这是AnsiChar
在 Delphi 7 中),移位如下Ord(Element) + Ord(Element) shl 8 + Ord(Element) shl 16 + Ord(Element) shl 24
,然后将字符串类型转换为PIntegerArray
(^array[0..MaxInt div 4 - 1] of Integer
)并循环它Length(Str) div 4
次,作为整数而不是字符进行比较。您需要比较最后几个Length(str) mod 4
不过手动输入字符。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)