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

Как удалить дубликаты в массиве целых чисел, сохраняя порядок элементов в Delphi и Pascal

Delphi , Синтаксис , Массивы

Вопрос, стоящий перед разработчиками, заключается в необходимости удаления всех повторяющихся элементов из массива целых чисел, при этом важно сохранить исходный порядок элементов. Рассмотрим на примере массива, содержащего числа 10,20,20(повтор),10(повтор),50, который после удаления дубликатов должен преобразоваться в 10,20,50.

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

Существует несколько способов решения данной задачи. Один из них — использование структуры данных, отличной от массива, например, словаря, который позволяет выполнять былые операции поиска и добавления элементов. Другой подход заключается в прямой обработке массива без использования дополнительных структур данных.

Решение с использованием словаря

Создаем словарь, где ключом будет элемент массива, а значение может быть любым. Затем проходим по исходному массиву, проверяем каждый элемент на наличие в словаре. Если элемент уже есть в словаре, то он является дубликатом и игнорируется. Если элемент отсутствует в словаре, то он добавляется в результирующий массив и в словарь.

Пример кода на Object Pascal (Delphi) с использованием словаря:

var
  arr: TArray<Integer>; // Исходный массив
  Dict: TDictionary<Integer, Integer>;
  SrcIndex, DestIndex: Integer;
begin
  DestIndex := 0;
  for SrcIndex := 0 to High(arr) do begin
    if not Dict.ContainsKey(arr[SrcIndex]) then begin
      arr[DestIndex] := arr[SrcIndex];
      Dict.Add(arr[SrcIndex], 0);
      Inc(DestIndex);
    end;
  end;
  SetLength(arr, DestIndex);
  // Не забудьте уничтожить словарь после использования
  Dict.Free;
end;

Решение без использования словаря

Этот подход заключается в прямой обработке массива. Для каждого элемента массива проверяем, не повторяется ли он в последующих позициях. Если повторяется, то сдвигаем элементы, чтобы удалить дубликат, и обновляем счетчик сдвигов.

Пример кода на Object Pascal (Delphi) без использования словаря:

procedure RemoveDuplicates(var arr: TArray<Integer>);
var
  i, j, k, tot, mov: Integer;
begin
  tot := 0;
  for i := 0 to Length(arr) - 1 do
  begin
    if i >= Length(arr) - tot - 1 then
      break;
    for j := i + 1 to Length(arr) - 1 - tot do
    begin
      if j >= Length(arr) - tot - 1 then
        break;
      mov := 0;
      while (i + mov < Length(arr)) and (arr[i] = arr[j + mov]) do
      begin
        Inc(mov);
        arr[j] := arr[j + mov];
      end;
      tot := tot + mov;
      if mov > 0 then
        for k := j + 1 to Length(arr) - 1 - tot do
          arr[k] := arr[k + mov];
    end;
  end;
  SetLength(arr, Length(arr) - tot);
end;

Выводы

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

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

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


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

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




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


:: Главная :: Массивы ::


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-03-14 10:23:29/0.0034739971160889/0