Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Ошибка индексации строк при удалении дубликатов в Delphi

Delphi , Компоненты и Классы , Списки

При работе с файлами в среде разработки Delphi, разработчики часто сталкиваются с необходимостью обработки данных, включая удаление дубликатов строк. Вопрос, поднятый в данном запросе, касается некорректной индексации строк при выполнении такой операции.

Описание проблемы

В представленном коде, предназначенном для удаления дубликатов из файла, используется двойной цикл для сравнения строк. После обнаружения дубликата, индекс строки выводится на экран, но при этом происходит его изменение в результате удаления строк из исходного списка. Это приводит к тому, что индекс строк, которые являются дубликатами, отображается неправильно: он всегда меньше фактического, что затрудняет дальнейший анализ данных.

Пример кода

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
              // Вывод индекса и строки перед удалением
              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.

Подход к решению

Проблема заключается в изменении индекса строк после их удаления, что делает текущие индексы некорректными. Чтобы решить эту проблему, можно изменить порядок итераций циклов. Вместо уменьшения внешнего индекса I вниз, следует начать с конца списка, чтобы избежать смещения индексов при удалении строк.

Подтвержденное решение

for I := Pred(slSrc.Count) downto 0 do
begin
  for J := 0 to I - 1 do
  begin
    // Проверка на дубликаты и дальнейшие действия
  end;
  slSrc.Delete(I);
end;

Заключение

Изменение порядка итераций позволяет избежать смещения индексов при удалении строк, что решает проблему индексации строк после удаления дубликатов. Важно помнить, что такие изменения могут повлиять на логику работы вашего приложения, поэтому всегда следует тщательно тестировать код после внесения изменений.

Создано по материалам из источника по ссылке.

При работе с файлами в Delphi при удалении дубликатов строк возникает проблема с индексацией из-за изменения индексов при их удалении.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Списки ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-05-09 09:43:18/0.0060498714447021/0