Delphi Как поменять местами объекты?
От: Tolstaya Tigra  
Дата: 18.06.03 06:01
Оценка:
Как правильно решить следующую задачу —
есть Collection: TCollection,
нужно отсортировать элементы TCollection (TCollectionItem) в соответствии с некоторым свойством каждого элемента коллекции.
Любой механизм сортировки предполагает обмен элементов местами.
Но код подобный следующему


P: Pointer;

P := Item[0];
Item0 := Item[1];
Item[1] := TCollectionItem[P]



не работает, в силу того, что Item0 := Item[1] неявно вызывает метод assign, вместо того, чтобы переадресовать указатель на объект (как этого хотелось бы)

Владимир Мусулайнен
Re: Delphi Как поменять местами объекты?
От: jhfrek Россия  
Дата: 18.06.03 06:13
Оценка:
Здравствуйте, Tolstaya Tigra, Вы писали:

TT>нужно отсортировать элементы TCollection (TCollectionItem) в соответствии с некоторым


А почему бы не использовать TObjectList?
Re[2]: Delphi Как поменять местами объекты?
От: Tolstaya Tigra  
Дата: 18.06.03 06:16
Оценка:
Здравствуйте, jhfrek, Вы писали:

J>Здравствуйте, Tolstaya Tigra, Вы писали:


TT>>нужно отсортировать элементы TCollection (TCollectionItem) в соответствии с некоторым


J>А почему бы не использовать TObjectList?


Ну в конечном итоге я сейчас и переопределяю наследование своих объектов от TObjectList, вместо TCollection, но вопрос уже интересует чисто из принципа, мало ли на будущее понадобится. Так что тем не менее, с жадностью впитаю знания, если кто поделится.

Владимир Мусулайнен
Re: Delphi Как поменять местами объекты?
От: Sinclair Россия https://github.com/evilguest/
Дата: 18.06.03 06:22
Оценка:
Здравствуйте, 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;

Потомок TCollectionItem обязан правильно инициализироваться присваиванием.
... << RSDN@Home 1.0 beta 7a >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[3]: Delphi Как поменять местами объекты?
От: jhfrek Россия  
Дата: 18.06.03 06:23
Оценка:
Здравствуйте, Tolstaya Tigra, Вы писали:

J>>А почему бы не использовать TObjectList?

TT>Ну в конечном итоге я сейчас и переопределяю наследование своих объектов от TObjectList, вместо TCollection, но вопрос уже интересует чисто из принципа, мало ли на будущее понадобится. Так что тем не менее, с жадностью впитаю знания, если кто поделится.

Знания по этому поводу здесь
Re[2]: Delphi Как поменять местами объекты?
От: Tolstaya Tigra  
Дата: 18.06.03 06:35
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Здравствуйте, Tolstaya Tigra, Вы писали:


S>
S>var
S>  C: TCollection;
S>  I: TCollectionItem;
S>  A, B: integer;
S>begin
S>  ...
S>  C.BeginUpdate;
S>  I:= C.Add; // создали временный элемент
S>  I:= C[A]; // скопировали в него
S>  C[A]:= C[B];
S>  C[B]:= I;
S>  C.Delete(I.Index) // убрали его
S>  C.EndUpdate;
S>end;
S>

S>Потомок TCollectionItem обязан правильно инициализироваться присваиванием.

Это означает, что нужно определять метод TCollectionItem.AssignTo? Я правильно понял?

Иными словами, через создание временного обьекта.
Да это вариант, я пробовал его. Минус такого решения — накладные расходы на
создание и уничтожение временного объекта (даже двух объектов — TCollectionItem и его TCollection).
Я бы не хотел использовть такое решение, так как я имею очень много коллекций (порядка нескольких тысяч)
которые нужно отсортировать. Мне кажется, что создание и уничтожение временных объектов внесет некоторое замедление в работу.
Хотя я могу ошибаться и замедление не будет значительным.

Владимир Мусулайнен
Re[4]: Delphi Как поменять местами объекты?
От: Tolstaya Tigra  
Дата: 18.06.03 06:38
Оценка:
Здравствуйте, jhfrek, Вы писали:

J>Знания по этому поводу здесь


Не, эти знания я знаю Я по поводу знаний как сделать так чтобы MyObj1 ссылался на память которая отведена под MyObj2и наооборот.

Владимир Мусулайнен
Re[3]: Delphi Как поменять местами объекты?
От: Sinclair Россия https://github.com/evilguest/
Дата: 18.06.03 07:02
Оценка:
Здравствуйте, Tolstaya Tigra, Вы писали:
TT>Это означает, что нужно определять метод TCollectionItem.AssignTo? Я правильно понял?
Да.
TT>Иными словами, через создание временного обьекта.
TT>Да это вариант, я пробовал его. Минус такого решения — накладные расходы на
TT>создание и уничтожение временного объекта
Да.
TT>(даже двух объектов — TCollectionItem и его TCollection).
Нет. Зачем? TCollection уже есть.
TT>Я бы не хотел использовть такое решение, так как я имею очень много коллекций (порядка нескольких тысяч)
А сколько элементов в каждой коллекции?
TT>которые нужно отсортировать. Мне кажется, что создание и уничтожение временных объектов внесет некоторое замедление в работу.
И весьма существенное. Это можно несколько сгладить, если создавать один временный объект на коллекцию на все время сортировки, а не на каждый обмен.
... << RSDN@Home 1.0 beta 7a >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[2]: Delphi Как поменять местами объекты?
От: Sinclair Россия https://github.com/evilguest/
Дата: 18.06.03 07:02
Оценка: :)
Здравствуйте, 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 элементов в каждом.

Владимир Мусулайнен
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.