Necesito saber si todos los caracteres de una cadena son iguales (formados por el mismo carácter). la función debe devolver verdadero o falso dependiendo de si todos los elementos de la cadena son iguales a un char particular.Cómo determinar si todos los caracteres de una cadena son iguales
Escribí esta función que funciona bien, pero estoy buscando una solución más óptima (más rápida), las cadenas pueden tener miles de caracteres.
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;
ACTUALIZACIÓN finalmente utilizando la sugerencia Barry Kelly y añadiendo la directiva inline
, el rendimiento se ha mejorado significativamente.
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;
ACTUALIZACIÓN 2
Lo siento, pero he publicado un viejo implementación de la solución (con un error), ahora es fijo. Gracias a The_Fox para crear una mejor implementación de la sugerencia de Barry.
por qué no utilizar el "===" triple igual para lo que se usa. compara si eso es absolutamente = a. Comprueba el tipo de datos y los caracteres – Val
@ Val, ¿desde cuándo Delphi tiene "==="? ¿Estás confundiendo Delphi con JavaScript? –
mi malo Estaba pensando en otra cosa ... – Val