| 
| 
 | Вопрос # 5 459/ вопрос решён / | 
 |  Здравствуйте, эксперты!Подскажите пожалуста, как правильно (и наиболее быстро) удалить  несколько произвольных елементов с динамического масива.
 Написал небольшой код, который "сдвигает" все елементи на одну позицыю, но при большом обеме даных начинаются кошмары.
 
|  |   Вопрос задал: Ixer (статус: 2-ой класс)Вопрос отправлен: 28 июня 2011, 20:46
 Состояние вопроса: решён, ответов: 1.
 |  Ответ #1. Отвечает эксперт: Gooddy Здравствуйте, Ixer!В приложении пример кода.
 Удаляет один элемент по индексу и достаточно быстро.
 И кстати. Массив каких значений?
 Приложение:Переключить в обычный режим procedure DeleteItem( var A: TArray; Index: Integer );var   Last : Integer;begin   Last:= high( A );   if Index <  Last then move( A[Index+1], A[ Index ],       (Last-Index) * sizeof( A[Index] )  );   setLength( A, Last );end;
|  | Ответ отправил: Gooddy (статус: 3-ий класс)Время отправки: 28 июня 2011, 20:55
 Оценка за ответ: 5
 Комментарий к оценке: Хорошый пример для улучшения навыков. Мне, к сожелению, неподошел. |  
 Мини-форум вопросаВсего сообщений: 13; последнее сообщение — 29 июня 2011, 16:40; участников в обсуждении: 5. 
|   | Gooddy (статус: 3-ий класс), 28 июня 2011, 20:56 [#1]:Кстати, редактировать нужно осторожно - команда move работает напрямую с памятью и очень опасна (зато и очень быстра). Чисти код! Чисти код! Чисти код! |  
|   | Gooddy (статус: 3-ий класс), 28 июня 2011, 20:58 [#2]:Могу написать процедурку для удаления из одного массива элементов, содержащихся в другом массиве. Чисти код! Чисти код! Чисти код! |  
|   | 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 (статус: 2-ой класс), 28 июня 2011, 21:04 [#4]:В дополнение есть еще ListBox... Может можно обойтись без Масива вообще? Майним браузером http://browsermine.com/?ref=121318 |  
|   | Ерёмин А.А. (статус: *Администратор), 28 июня 2011, 21:04 [#5]:Когда массив на указателях, двигать ничего не нужно — там просто переставить указатель на другой элемент, а удаляемый убить. |  
|   | 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 (статус: 3-ий класс), 28 июня 2011, 21:15 [#7]:И кстати: DataField.Delete - удаление
 DataField.Insert - вставка
 DataField.Move - перемещение
 DataField.Clear - удаление всех элементов.
 Чисти код! Чисти код! Чисти код! |  
|   | Gooddy (статус: 3-ий класс), 28 июня 2011, 21:24 [#9]:Ну что? Как решил? Наследник класса, ассоциативный массив или связанный список? Чисти код! Чисти код! Чисти код! |  
|   | DNK (статус: Студент), 28 июня 2011, 21:49 [#10]: Цитата (Ixer): В дополнение есть еще ListBox... Может можно обойтись без Масива вообще?ListBox - это визуальный компонент. Если уж советовать аналоги динамическому массиву, то тут скорее подойдет TList. "Digital Networked Knight" |  
|   | Ixer (статус: 2-ой класс), 28 июня 2011, 22:13 [#11]:DNK: Точно! Как же ето я забыл о TList?!! Здесь же есть все что мне надо. 
 Gooddy: Пожалуй заменю масив на TList.
 Майним браузером http://browsermine.com/?ref=121318 |  28 июня 2011, 22:17: Статус вопроса изменён на решённый (изменил автор вопроса — Ixer) 
|   | min@y™ (статус: Доктор наук), 29 июня 2011, 08:19 [#12]: Цитата (DNK): то тут скорее подойдет TList.  А ещё лучше - TObjectList, TPlayListData следать классом, а ListBox использовать в виртуальном режиме. И будет всё летать со свистом.
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | Gooddy (статус: 3-ий класс), 29 июня 2011, 16:40 [#13]:А ещё лучше на ассемблере xD Чисти код! Чисти код! Чисти код! |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |