Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 5 459

/ вопрос решён /

Здравствуйте, эксперты!
Подскажите пожалуста, как правильно (и наиболее быстро) удалить несколько произвольных елементов с динамического масива.
Написал небольшой код, который "сдвигает" все елементи на одну позицыю, но при большом обеме даных начинаются кошмары.

Ixer Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: Ixer (статус: 2-ой класс)
Вопрос отправлен: 28 июня 2011, 20:46
Состояние вопроса: решён, ответов: 1.

Ответ #1. Отвечает эксперт: Gooddy

Здравствуйте, Ixer!
В приложении пример кода.
Удаляет один элемент по индексу и достаточно быстро.
И кстати. Массив каких значений?

Приложение:
  1. procedure DeleteItem( var A: TArray; Index: Integer );
  2. var
  3. Last : Integer;
  4. begin
  5. Last:= high( A );
  6. if Index < Last then move( A[Index+1], A[ Index ],
  7. (Last-Index) * sizeof( A[Index] ) );
  8. setLength( A, Last );
  9. end;


Ответ отправил: Gooddy (статус: 3-ий класс)
Время отправки: 28 июня 2011, 20:55
Оценка за ответ: 5

Комментарий к оценке: Хорошый пример для улучшения навыков. Мне, к сожелению, неподошел.

Мини-форум вопроса

Всего сообщений: 13; последнее сообщение — 29 июня 2011, 16:40; участников в обсуждении: 5.
Gooddy

Gooddy (статус: 3-ий класс), 28 июня 2011, 20:56 [#1]:

Кстати, редактировать нужно осторожно - команда move работает напрямую с памятью и очень опасна (зато и очень быстра).
Чисти код! Чисти код! Чисти код!
Gooddy

Gooddy (статус: 3-ий класс), 28 июня 2011, 20:58 [#2]:

Могу написать процедурку для удаления из одного массива элементов, содержащихся в другом массиве.
Чисти код! Чисти код! Чисти код!
Ixer

Ixer (статус: 2-ой класс), 28 июня 2011, 20:58 [#3]:

  TPlayListData = packed record
    Title:string;
    path:string;
    index:Integer;
  end;
 
var VirtList:array of TPlayListData;

Вот такие даные...
Майним браузером http://browsermine.com/?ref=121318
Ixer

Ixer (статус: 2-ой класс), 28 июня 2011, 21:04 [#4]:

В дополнение есть еще ListBox... Может можно обойтись без Масива вообще?
Майним браузером http://browsermine.com/?ref=121318
Ерёмин А.А.

Ерёмин А.А. (статус: *Администратор), 28 июня 2011, 21:04 [#5]:

Когда массив на указателях, двигать ничего не нужно — там просто переставить указатель на другой элемент, а удаляемый убить.
Gooddy

Gooddy (статус: 3-ий класс), 28 июня 2011, 21:12 [#6]:

Ixer: лучше всего - заменить TPlayListData на ассоциативный массив (класс TStringList):

Добавление:
DataField.Add( Format('%s=%s', ['Title', 'Path']) );
Получение Path по Title:
DataField.Values['Title']
Получение Title по Index:
DataField.ValueFromIndex[1]
Получение Index по Path:
DataField.IndexOf('Path');
Получение Index по Title:
DataField.IndexOfName('Path');
Получение Title и Path по Index (нужно пропарсить):
DataField.Strings['Path'];

Некоторые из этих команд я давно не использовал, поэтому нужно проверить их на работоспособность.
Удачи.
Чисти код! Чисти код! Чисти код!
Gooddy

Gooddy (статус: 3-ий класс), 28 июня 2011, 21:15 [#7]:

И кстати:
DataField.Delete - удаление
DataField.Insert - вставка
DataField.Move - перемещение
DataField.Clear - удаление всех элементов.
Чисти код! Чисти код! Чисти код!
Gooddy

Gooddy (статус: 3-ий класс), 28 июня 2011, 21:19 [#8]:

"В дополнение есть еще ListBox... Может можно обойтись без Масива вообще?"

Лучшие всего будет написать класс - наследник TListBox.

Вот хороший пример:
http://www.delphi.int.ru/forum/topic/118/3/#m1048
Чисти код! Чисти код! Чисти код!
Gooddy

Gooddy (статус: 3-ий класс), 28 июня 2011, 21:24 [#9]:

Ну что? Как решил? Наследник класса, ассоциативный массив или связанный список?
Чисти код! Чисти код! Чисти код!
DNK

DNK (статус: Студент), 28 июня 2011, 21:49 [#10]:

Цитата (Ixer):

В дополнение есть еще ListBox... Может можно обойтись без Масива вообще?
ListBox - это визуальный компонент. Если уж советовать аналоги динамическому массиву, то тут скорее подойдет TList.
"Digital Networked Knight"
Ixer

Ixer (статус: 2-ой класс), 28 июня 2011, 22:13 [#11]:

DNK: Точно! Как же ето я забыл о TList?!! Здесь же есть все что мне надо.

Gooddy: Пожалуй заменю масив на TList.
Майним браузером http://browsermine.com/?ref=121318

28 июня 2011, 22:17: Статус вопроса изменён на решённый (изменил автор вопроса — Ixer)

min@y™

min@y™ (статус: Доктор наук), 29 июня 2011, 08:19 [#12]:

Цитата (DNK):

то тут скорее подойдет TList.

А ещё лучше - TObjectList, TPlayListData следать классом, а ListBox использовать в виртуальном режиме. И будет всё летать со свистом.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Gooddy

Gooddy (статус: 3-ий класс), 29 июня 2011, 16:40 [#13]:

А ещё лучше на ассемблере xD
Чисти код! Чисти код! Чисти код!

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 28 марта 2023, 09:00
Выполнено за 0.02 сек.
Рейтинг@Mail.ru