Как правильно решить следующую задачу —
есть Collection: TCollection,
нужно отсортировать элементы TCollection (TCollectionItem) в соответствии с некоторым свойством каждого элемента коллекции.
Любой механизм сортировки предполагает обмен элементов местами.
Но код подобный следующему
не работает, в силу того, что Item0 := Item[1] неявно вызывает метод assign, вместо того, чтобы переадресовать указатель на объект (как этого хотелось бы)
Здравствуйте, jhfrek, Вы писали:
J>Здравствуйте, Tolstaya Tigra, Вы писали:
TT>>нужно отсортировать элементы TCollection (TCollectionItem) в соответствии с некоторым
J>А почему бы не использовать TObjectList?
Ну в конечном итоге я сейчас и переопределяю наследование своих объектов от TObjectList, вместо TCollection, но вопрос уже интересует чисто из принципа, мало ли на будущее понадобится. Так что тем не менее, с жадностью впитаю знания, если кто поделится.
Здравствуйте, Tolstaya Tigra, Вы писали:
TT>Как правильно решить следующую задачу — TT>есть Collection: TCollection, TT>нужно отсортировать элементы TCollection (TCollectionItem) в соответствии с некоторым свойством каждого элемента коллекции. TT>Любой механизм сортировки предполагает обмен элементов местами.
var
C: TCollection;
I: TCollectionItem;
A, B: integer;
begin
...
C.BeginUpdate;
I:= C.Add; // создали временный элемент
I:= C[A]; // скопировали в него
C[A]:= C[B];
C[B]:= I;
C.Delete(I.Index) // убрали его
C.EndUpdate;
end;
Здравствуйте, Tolstaya Tigra, Вы писали:
J>>А почему бы не использовать TObjectList? TT>Ну в конечном итоге я сейчас и переопределяю наследование своих объектов от TObjectList, вместо TCollection, но вопрос уже интересует чисто из принципа, мало ли на будущее понадобится. Так что тем не менее, с жадностью впитаю знания, если кто поделится.
Это означает, что нужно определять метод TCollectionItem.AssignTo? Я правильно понял?
Иными словами, через создание временного обьекта.
Да это вариант, я пробовал его. Минус такого решения — накладные расходы на
создание и уничтожение временного объекта (даже двух объектов — TCollectionItem и его TCollection).
Я бы не хотел использовть такое решение, так как я имею очень много коллекций (порядка нескольких тысяч)
которые нужно отсортировать. Мне кажется, что создание и уничтожение временных объектов внесет некоторое замедление в работу.
Хотя я могу ошибаться и замедление не будет значительным.
Здравствуйте, Tolstaya Tigra, Вы писали: TT>Это означает, что нужно определять метод TCollectionItem.AssignTo? Я правильно понял?
Да. TT>Иными словами, через создание временного обьекта. TT>Да это вариант, я пробовал его. Минус такого решения — накладные расходы на TT>создание и уничтожение временного объекта
Да. TT>(даже двух объектов — TCollectionItem и его TCollection).
Нет. Зачем? TCollection уже есть. TT>Я бы не хотел использовть такое решение, так как я имею очень много коллекций (порядка нескольких тысяч)
А сколько элементов в каждой коллекции? TT>которые нужно отсортировать. Мне кажется, что создание и уничтожение временных объектов внесет некоторое замедление в работу.
И весьма существенное. Это можно несколько сгладить, если создавать один временный объект на коллекцию на все время сортировки, а не на каждый обмен.
... << RSDN@Home 1.0 beta 7a >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Sinclair, Вы писали всякую хрень.
Надо так:
var
C: TCollection;
A, B: integer;
begin
...
//Предполагаем, что A<B
C.BeginUpdate;
C[B].Index:= A; // C[A] сдвинулся вправо
C[A+1].Index:= B;
C.EndUpdate;
end;
... << RSDN@Home 1.0 beta 7a >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[4]: Delphi Как поменять местами объекты?
От:
Аноним
Дата:
18.06.03 07:13
Оценка:
Здравствуйте, Sinclair, Вы писали:
TT>>(даже двух объектов — TCollectionItem и его TCollection). S>Нет. Зачем? TCollection уже есть.
Да, согласен, был не прав. Меня просто смутило создание временного CollectionItem внутри коллекции которую же и сортируешь, но раз он тут же и удаляется, то все нормально.
S>А сколько элементов в каждой коллекции?
немного от 1 до 200, в среднем 10-20.
ТО есть имеем несколько тысяч коллекций по 20 элементов в каждом.