Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.08.2010, 10:15   #1
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию Корректное удаление элементов массива

С жары чего-то не догоню .
Смысл в следующем. Имеется список значений. Элементы с этими значениями (не индексами) должны быть удалены. Функция поиск индекса массива по значению есть.

ЗЫ. Массив динамический

-----ДОБАВЛЕНО:------------------

Пример.
Имеется два массива:
А[1]:='ааа';
А[2]:='ааб';
А[3]:='аав';
А[4]:='ааг';
А[5]:='аап';
А[6]:='аар';
А[7]:='аао';
А[8]:='аал';

и
B[1]:='ффф';
B[2]:='ааа';
B[3]:='аап';

В результате работы этой функции в массиве A должны остаться только элементы 'aaa' и 'аап'
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика

Последний раз редактировалось Utkin; 10.08.2010 в 10:33.
Utkin вне форума Ответить с цитированием
Старый 10.08.2010, 10:29   #2
DIgorevich
Погулять вышел
Участник клуба
 
Аватар для DIgorevich
 
Регистрация: 17.05.2010
Сообщений: 1,573
По умолчанию

Так а в чем суть вопроса? Если есть индексы, то и удалить можно:
Код:
  Lab: TComponent;
begin
  for i := 1 to количество удаляемых компонентов do begin
    Lab := FindComponent(название компонента);
    (Lab as TComponent).Free;
Никогда не знаешь, где тебе повезет... (Фрай)
DIgorevich вне форума Ответить с цитированием
Старый 10.08.2010, 10:46   #3
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Типа того, но не все так просто. Как только ты удалишь срединный элемент, индексы сместятся. Это первое. И второе в цикле идет одно число элементов, но как только ты удалишь хоть один элемент, то их число станет меньше. Это чревато двумя последствиями. Первое - половина индексов будет пропущена. Второе - переменная i получит значение большее чем текущее число элементов в массиве.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика

Последний раз редактировалось Utkin; 10.08.2010 в 11:00.
Utkin вне форума Ответить с цитированием
Старый 10.08.2010, 11:02   #4
DIgorevich
Погулять вышел
Участник клуба
 
Аватар для DIgorevich
 
Регистрация: 17.05.2010
Сообщений: 1,573
По умолчанию

может тогда рекурсией, с вызовом после удаления?
Никогда не знаешь, где тебе повезет... (Фрай)
DIgorevich вне форума Ответить с цитированием
Старый 10.08.2010, 11:03   #5
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

При большом числе элементов выпадает в Access Violation (еще до наступления Stack Overflow).
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 10.08.2010, 11:05   #6
Sparkman
220400
Форумчанин
 
Аватар для Sparkman
 
Регистрация: 21.05.2010
Сообщений: 726
Радость

Создай еще 3й динамический массив типа integer, и в него записывай индексы, которые совпадают в массивах А и В. Затем на основе сохраненных индексов создаешь результирующий массив

ПС: кондиционер надо покупать)
Cерьёзной помощи не ждите - помогаю в перерывах на "перекур".
Не существует ничего невозможного для человека, который не собирается ничего делать сам.
Не учите человека, если вы не его учитель.
Sparkman вне форума Ответить с цитированием
Старый 10.08.2010, 11:09   #7
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Создание третьего массива не Айс . Это утрированный пример. Массивы имеют сложные структуры, создание которых накладно как по времени, так и по занимаемому объему.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 10.08.2010, 11:12   #8
DIgorevich
Погулять вышел
Участник клуба
 
Аватар для DIgorevich
 
Регистрация: 17.05.2010
Сообщений: 1,573
По умолчанию

или как вариант. Ищешь в массиве нужные значения, а все A[i], которые не подходят заносишь в STringlist (столбиком). После прохода по массиву, запускаешь цикл удаления элементов массивов согласно стринглисту. Только в обратном порядке, чтобы индексы не смещались

Либо вообще, искомое куда-нибудь сохраняем, потом очищаем массив и добавляем сохраненное искомое...
Никогда не знаешь, где тебе повезет... (Фрай)

Последний раз редактировалось DIgorevich; 10.08.2010 в 11:15.
DIgorevich вне форума Ответить с цитированием
Старый 10.08.2010, 11:17   #9
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Есть другой вариант: считывать массив и удалять элементы нужно сверху вниз, тогда на смещение индексов будет наплевать. downto.
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 10.08.2010, 11:29   #10
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Можно так
Код:
move(A[i + 1], A[i], sizeof(A[i]) * (length(A) - i));
setlength(A, length(A) - 1);
Как уже говорили проход с конца
eoln вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удаление и перемещение элементов массива в паскале Devilman Помощь студентам 4 21.04.2010 15:17
Удаление элементов из массива Jasper92 Общие вопросы C/C++ 3 06.03.2010 13:04
Удаление, сортировка элементов массива. Vadim123456 Помощь студентам 8 14.02.2010 23:43
удаление одинаковых элементов из массива sauron99 Общие вопросы Delphi 6 15.04.2009 21:27
Удаление элементов из динамического массива dashulka Общие вопросы Delphi 4 31.10.2008 14:03