我试图在delphi中删除相同的数组元素.
举些例子 :
R [1]:= 33332111111111111111111111323333333334378777433333344333333333277
举些例子 :
R [1]:= 33332111111111111111111111323333333334378777433333344333333333277
我想使它成为32132343787434327.并保存在新数组中.
你能说点什么吗?
我已经尝试将每个R [1]元素都设置为Array.并尝试了一些代码.
for i:=1 to length(NR) do begin found:=false; for k:=i+1 to length(NR) do begin if (NR[i]=NR[k]) then begin found:=true; end; end; if (not found) then begin Memo1.Lines.Add(NR[i]); end; end;
但结果是184327.
你们能帮助我吗?非常感谢.我非常渴望这样做.
解决方法
您似乎使用字符串而不是数组.在这种情况下,您需要此功能:
function RemoveAdjacentDuplicates(const X: string): string; var i,j: Integer; begin SetLength(Result,Length(X)); j := 0; for i := 1 to Length(Result) do if (i=1) or (X[i]<>X[i-1]) then begin inc(j); Result[j] := X[i]; end; SetLength(Result,j); end;
让我们来解决这个问题.
首先,我分配结果变量.这可能是一个过度分配.我们知道结果不能大于输入.
我们使用两个索引局部变量,相当弱的名为i和j.我们可以给它们描述性的名称,但是对于这么短的函数,人们可能会认为它没有必要.如果您愿意,请随时提出其他名称.例如,您可以选择idxIn和idxOut.
一个变量索引输入,另一个索引输出.输入索引用于简单的for循环.每次找到唯一项时,输出索引都会递增.
if条件测试输入索引是否指的是与前一个字符不同的字符.第一个元素没有前一个元素,所以我们总是包含它.
一旦循环完成,我们就知道输出有多长并且可以执行最终分配.
将其适用于阵列很简单.您只需要使用从零开始的索引来考虑数组.为了一点乐趣,这里是数组的通用版本:
type TMyArrayHelper = class class function RemoveAdjacentDuplicates<T>(const X: array of T): TArray<T>; static; end; class function TMyArrayHelper.RemoveAdjacentDuplicates<T> (const X: array of T): TArray<T>; var i,j: Integer; Comparer: IEqualityComparer<T>; begin Comparer := TEqualityComparer<T>.Default; SetLength(Result,Length(X)); j := 0; for i := 0 to high(Result) do if (i=0) or not Comparer.Equals(X[i],X[i-1]) then begin Result[j] := X[i]; inc(j); end; SetLength(Result,j); end;
注意inc(j)的微妙不同的位置.这是通过切换到从零开始的索引所必需的.
一个稍微复杂的替代方案,测试次数更少:
class function TMyArrayHelper.RemoveAdjacentDuplicates<T> (const X: array of T): TArray<T>; var i,j,len: Integer; Comparer: IEqualityComparer<T>; begin Comparer := TEqualityComparer<T>.Default; len := Length(X); SetLength(Result,len); if len=0 then exit; Result[0] := X[0]; j := 1; for i := 1 to len-1 do if not Comparer.Equals(X[i],j); end;