删除重复的数组元素

时间:2015-12-25 13:58:01

标签: arrays delphi dynamic-arrays static-array

我需要从整数数组中删除所有重复值,但仍保持元素的顺序:

示例:

10,20,20(duplicate),10(duplicate),50

变为:

10,20,50

2 个答案:

答案 0 :(得分:0)

  1. 创建一个以Integer为键的字典。值类型并不重要。
  2. 遍历输入数组。对于输入数组中的每个值,请检查该值是否在字典中。
  3. 如果是,这是重复的,丢弃。
  4. 如果不是,这是第一次遇到该值。保留该值,并将其添加到字典中。
  5. 字典的意思是它可以执行O(1)查找。

    在伪代码中:

    var
      arr: TArray<Integer>; // input and output
      Dict: TDictionary<Integer, Integer>;
      SrcIndex, DestIndex: Integer;
    ....
    DestIndex := 0;
    for SrcIndex := 0 to high(arr) do begin
      Value := arr[SrcIndex];
      if not Dict.ContainsKey(Value) then begin
        arr[DestIndex] := arr[SrcIndex];
        Dict.Add(Value, 0);
        inc(DestIndex);
      end;
    end;
    SetLength(arr, DestIndex);
    

    显然你需要创建和销毁字典。我假设你知道怎么做。我已选择修改阵列,但如果您愿意,可以同样创建一个新阵列。

答案 1 :(得分:0)

这里是没有字典的版本。

procedure TForm2.Button1Click(Sender: TObject);
var
  i,j,k:integer;
  arr:array of integer;
begin
  arr := [10,20,30,40,30,20,10,50,10,70,0,40];
  for i := 0 to length(arr)-1 do
    for j := length(arr)-1 downto i+1 do
      if arr[i] = arr[j] then
      begin
        for k := j+1 to length(arr)-1 do
          arr[k-1] := arr[k];
        SetLength(arr,length(arr)-1);
      end;
end;