Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 如何确定字符串中的所有字符是否相等_Delphi_String_Delphi 7 - Fatal编程技术网

Delphi 如何确定字符串中的所有字符是否相等

Delphi 如何确定字符串中的所有字符是否相等,delphi,string,delphi-7,Delphi,String,Delphi 7,我需要知道字符串中的所有字符是否相等(由相同的字符组成)。函数必须返回true或false,这取决于字符串的所有元素是否都等于特定字符 我写的这个函数运行得很好,但我正在寻找一个更优化(最快)的解决方案,字符串可以有数千个字符 function AllElementsAreEqual(Element:Char;Str:String):Boolean; var i : Integer; begin Result:=True; if Str<>'' then for i:=1

我需要知道字符串中的所有字符是否相等(由相同的字符组成)。函数必须返回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;
更新2

很抱歉,我发布了一个解决方案的旧实现(有一个bug),现在已经修复了。 感谢为Barry建议创建更好的实现。

可能用于生成一个目标字符重复N次的字符串,然后进行字符串比较,而不是逐字符比较


(不知道这是否真的更快;请测量并查看)。

根据我从您的代码中了解的情况

Result:= False;

:=”用于为变量赋值。如何比较Delphi中的2个值?< /P> < P>可以考虑用<代码>元素< /COD> 4次重复创建< <代码>整数< /代码>值(因为这是<代码> ANSHICAR < /代码>在Delphi 7中),如<代码> ORD(元素)+ORD(元素)SL 8 + ORD(元素)SHL 16 + ORD(元素)SHL 24 < /代码>,然后将字符串键入整数的
PIntegerArray
^array[0..MaxInt div 4-1])并在其上循环
Length(Str)div 4
次,以整数而不是字符进行比较。不过,您需要手动比较最后几个
长度(str)mod 4
字符。

您可以实现更快的查找字符,如果字符串为“True”,这不会提高速度,但应该会使查找速度更快

获取字符串长度,使用GetMem分配字符串大小的内存。用所需的字符填充内存。然后使用CompareMem比较字符串和内存

您错误地实现了Barry Kelly的建议。当我在Delphi7上测试它时,它甚至比您的第一个实现还要慢,如果您的stringlength不能被4整除,它会给出错误的结果

我用这个字符串测试它:
StringOfChar('c',100000)+'x'allegementsareequal('c',StringOfChar('c',100000)+'x')
,而它应该返回False

您的实现速度较慢,因为您试图将字符串除以4(在这种情况下,您失败了,但您可以自己找出失败的原因),从而创建一个新字符串,该字符串需要昂贵的内存分配

另一个危险的做法是让动态数组(整数数组)指向字符串。两者都是重新计数的,这可能会导致奇怪的结果。请听从巴里·凯利的建议,使用皮特格雷

我认为巴里·凯利的意思是:

function AllElementsAreEqual(const aElement: Char; const aStr: string): Boolean;
var
  lIntArray: PIntegerArray;
  i: Integer;
  lTest: Integer;
begin
  Result := True;
  lTest := Ord(aElement) + Ord(aElement) shl 8 + Ord(aElement) shl 16 + Ord(aElement) shl 24;

  lIntArray := @aStr[1];
  for i := 0 to Length(aStr) div 4 - 1 do
    if lIntArray[i] <> lTest then
    begin
      Result := False;
      Exit;
    end;

  for i := Length(aStr) - (Length(aStr) mod 4) + 1 to Length(aStr) do
    if aStr[i] <> aElement then
    begin
      Result := False;
      Exit;
    end;
end;
function-allegementsareequal(常量元素:Char;常量元素:string):布尔;
变量
林特阵列:Pintegerray;
i:整数;
lTest:整数;
开始
结果:=真;
lTest:=Ord(AELENT)+Ord(AELENT)shl 8+Ord(AELENT)shl 16+Ord(AELENT)shl 24;
lintary:=@aStr[1];
对于i:=0到长度(aStr)div 4-1 do
如果lIntArray[i]lTest,则
开始
结果:=假;
出口
结束;
对于i:=长度(aStr)-(长度(aStr)mod 4)+1到长度(aStr)do
如果aStr[i]是元素,则
开始
结果:=假;
出口
结束;
结束;
注意:对于空字符串,函数返回True,可以吗


NB2:请将分数奖励给巴里·凯利的答案,而不是我的答案,因为这确实是一个过大的评论,而不是一个答案。

为什么不使用“==”三等分,这就是它的用途。比较是否为绝对=至。检查数据类型以及chars@Val,Delphi什么时候开始有“==”?你把Delphi和JavaScript搞混了吗?糟糕的是,我在想别的东西……Delphi中的运算符:从逻辑上讲,是等号,而不是等号或===或其他奇怪的东西通常读作“已分配给”或“成为”。==来自“C”(原为“B”)。然而,BCPL使用了:=,它来自Algol。由于这个奇怪的决定(可能是汤普森和/或里奇做出的),成千上万的bug是由于误用了=而不是==天才而产生的,我怎么能从来没有想到这一点。坦白地说,我从来没有看到过如此精彩的答案,但你遗漏了一点,那就是,
标记在英语中被称为冒号。我希望这里的许多人继续投票支持你的答案。>-(讽刺是不必要的,@Vantomex.@Rob,你没看到他只是想故意玩弄他的答案吗?如果这样做没有后果的话,这种坏态度可能会一次又一次地重复。你为什么对我说那样的话,Gerry也像我一样做了?你为什么不绝对警告@KhanZeeshan?+1对不起,但昨晚我做了,伙计y使用不同的实现进行了测试,我发布了一个建议解决方案的旧实现(有一个bug),现在已经修复。非常感谢您为Barry建议创建了一个更好的实现。这是Delphi编译器用来加快速度的技巧吗?;)这是它用于字符串哈希和比较的技巧之一,是的。
function AllElementsAreEqual(const aElement: Char; const aStr: string): Boolean;
var
  lIntArray: PIntegerArray;
  i: Integer;
  lTest: Integer;
begin
  Result := True;
  lTest := Ord(aElement) + Ord(aElement) shl 8 + Ord(aElement) shl 16 + Ord(aElement) shl 24;

  lIntArray := @aStr[1];
  for i := 0 to Length(aStr) div 4 - 1 do
    if lIntArray[i] <> lTest then
    begin
      Result := False;
      Exit;
    end;

  for i := Length(aStr) - (Length(aStr) mod 4) + 1 to Length(aStr) do
    if aStr[i] <> aElement then
    begin
      Result := False;
      Exit;
    end;
end;