在delphi中删除相同的元素数组

时间:2014-04-09 19:07:19

标签: delphi

我试图在delphi中删除相同的数组元素。 例如:
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 你们能帮助我吗?非常感谢。我非常渴望这样做。

1 个答案:

答案 0 :(得分:14)

您似乎使用的是字符串而不是数组。在这种情况下,您需要此功能:

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;

让我们来完成这项工作。

首先,我分配结果变量。这可能是一个过度分配。我们知道结果不能大于输入。

我们使用两个索引局部变量,名称相当弱ij。我们可以给它们描述性的名称,但是对于这么短的函数,人们可能会认为它没有必要。如果您愿意,请随时提出其他名称。例如,您可以选择idxInidxOut

一个变量索引输入,另一个索引输出。输入索引用于简单的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], X[i-1]) then
    begin
      Result[j] := X[i];
      inc(j);
    end;
  SetLength(Result, j);
end;