|
Вопрос # 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:19 [#8]:
"В дополнение есть еще ListBox... Может можно обойтись без Масива вообще?"
Лучшие всего будет написать класс - наследник TListBox.
Вот хороший пример:
http://www.delphi.int.ru/forum/topic/118/3/#m1048
Чисти код! Чисти код! Чисти код!
|
|
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
Чисти код! Чисти код! Чисти код!
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|