Удалить дублирующиеся строки из файла, работающего, но не отображающего правильный индекс - PullRequest
0 голосов
/ 21 апреля 2020

Следующий код работает нормально, удаляя правильные дублированные строки, но когда я показываю I перед удалением строки StringList отображается правильно индекс (I ) только из первого вхождения дубликата, после того, как индекс показывается неверным, не соответствующим корректному (всегда меньший, чем реальный индекс). Как это исправить?

Это код:

program Project1;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.Classes,
  System.SysUtils;

var
  slSrc, slDup: TStringList;
  I, J: Integer;

begin
  try
    slDup := TStringList.Create;
    try
      slSrc := TStringList.Create;
      try
        slSrc.LoadFromFile('C:\src.txt');

        for I := 0 to Pred(slSrc.Count) do
        begin
          for J := Pred(slSrc.Count) downto I + 1 do
          begin
            if SameStr(slSrc[I], slSrc[J]) then
            begin
              // Ex; If 1º dup index is = 3, is showed 3. OK
              // If 2º dup index is = 15, is showed always a minor like 13 for example
              // and continue displaying wrong index for next dups

              Writeln(IntToStr(I) + ' : ' + slSrc[I]);
              slDup.Add(slSrc[I]);
              slSrc.Delete(I);
            end;
          end;
        end;
        slSrc.SaveToFile('C:\src.txt');
        slDup.SaveToFile('C:\dup.txt');
      finally
        slSrc.Free;
      end;
    finally
      slDup.Free;
    end;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  Readln;
end.

1 Ответ

3 голосов
/ 21 апреля 2020

Если удаление дубликатов с более высокими индексами не нарушает ваши правила, просто сделайте внешний l oop вниз. В этом случае удаление сохраняет остальное.

 for I := Pred(slSrc.Count) downto 0 do
    begin
      for J := 0 to I - 1 do
 ...
         slSrc.Delete(I);
...