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;
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;
UPDATE 2
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.
Check Equal Char Using the == Equal Operator in Java We can use this operator to check two characters are equal or not. In this example, we created three chars and compared them using the == equals operator. This operator returns true if both the chars are equal, false otherwise.
If the task is "check if all the symbols in a string are the same", s == len(s) * s[0] is a valid answer (no symbols mean an error, and exception is ok).
The equals() method compare two strings on the basis of their values or content for equality. This method compare the strings ignoring the case( case-insensitive ). It returns true if values of both the strings is same ignoring the case, else return false.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With