我需要知道字符串中的所有字符是否相等(由同一个字符组成)。该函数必须返回true或false,这取决于字符串的所有元素是否等于特定的字符。
I need to know if all characters in a string are equal (formed by the same character). the function must return true or false depending if all the elements of the string are equal to an particular char.
我写了这个功能很好,但我正在看对于一个更优化(最快)的解决方案,字符串可以有数千个字符。
I wrote this function that works well, but I'm looking for a more optimal (fastest) solution, the strings can have thousands of chars.
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建议并添加 inline 指令,性能显着提高。
UPDATE finally using the Barry Kelly Suggestion and adding the inline directive, the performance was significantly improved.
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
我很抱歉,但我发布了解决方案的旧实现(有一个bug),现在已经修复了。 感谢 The_Fox ,以更好地实施Barry建议。
i'm sorry but i posted an old implementation of the solution (with a bug), now is fixed. Thanks to The_Fox for create a better implementation of the Barry suggestion.
推荐答案您可以考虑使用元素$创建一个整数 c $ c>重复4次(因为这是Delphi 7中的 AnsiChar ),像 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 times,以整数比较而不是人物。您需要手动比较最后几个 Length(str)mod 4 的字符。
You could consider creating an Integer value with the Element repeated 4 times (since this is AnsiChar in Delphi 7), shifted like Ord(Element) + Ord(Element) shl 8 + Ord(Element) shl 16 + Ord(Element) shl 24, then typecast the string to a PIntegerArray (^array[0..MaxInt div 4 - 1] of Integer) and loop over it Length(Str) div 4 times, comparing as integers instead of characters. You'll need to compare the last few Length(str) mod 4 characters manually though.
更多推荐
如何确定字符串中的所有字符是否相等
发布评论