Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Сортировака с помощью TObjectList [D7, XP]


Страницы:   1 2 3

Константин ©   (2010-03-05 11:12:00) 

Скажите пожалуйста возможно ли отсортировать TObjectList, используя метод объекта в роли TListSortCompare. Это нужно для того, чтобы отсортировать индексированные объекты, то есть фактически отсортировать индексы объектов, хранящиеся в TObjectList, а сами объекты оставить нетронутыми в хранилище, являющимся свойством класса, метод которого и хочу использовать для сортировки. В этом методе будут доступны объекты хранилища через их индексы.


Константин   (2010-03-06 17:08:00) [21]


> Так я ничего и не понял...

чтобы иметь доступ к каким-то коллекциям объектов, я использовал индесы объектов в коллекции, т.е порядковый номер объекта. Это позволяло не заботиться о ссылках на объекты как указателях, это были просто переменные целого типа (конечно глупый аргумент) Но появлялось очень много гемороя, когда нужно было что то пербрать или отсортировать. Надо было сортировать индексы досупа, а не объекты. Я знал, что это бред, потому что, напрмер на PHP, я пишу явно не так.
Вот я наконец понял, что оперировать как раньше не надо, это не удобно и неправильно. Надо просто эффетивно работать с указателсями и всё.


Юрий Зотов   (2010-03-05 21:49:00) [22]

Так я ничего и не понял...


Константин   (2010-03-05 19:21:00) [23]

да я запутанно объясняю. В любом случае спасибо за помощь!


Игорь Шевченко   (2010-03-05 16:43:00) [24]


> И еще, если я добавляю уже созданный объект в TObjtctList
> то копируется ссылка правильно? Два объекта не создаются.
>  При какой-то сложной реализации каких-то алгоритмов, допустим,
>  создаются объекты в хранилище, в моем случае список TObjectList.
>  А операции с их данным проводятся лишь с помощью указателей
> на них, а не индексацией в TObjectList. Это правильный подход?
>


Извини, не понимаю. TObjectList всегда хранит только указатели на объекты (как и его предок, TList), поэтому как в этом свете понимать твою фразу - я не знаю.


Константин   (2010-03-05 16:16:00) [25]


> так решают

спасибо.
И еще, если я добавляю уже созданный объект в TObjtctList то копируется ссылка правильно? Два объекта не создаются. При какой-то сложной реализации каких-то алгоритмов, допустим, создаются объекты в хранилище, в моем случае список TObjectList. А операции с их данным проводятся лишь с помощью указателей на них, а не индексацией в TObjectList. Это правильный подход?


Игорь Шевченко   (2010-03-05 16:10:00) [26]


> Как её обычно решают


type
 TClass2 = class;

 TClass1 = class
   Class2: TClass2;
 end;

 TClass2 = class
   Class1: TClass1;
 end;

так решают


Константин   (2010-03-05 16:06:00) [27]

Проблема в моем понимании реализации алгоримтов в Daphi оперируя разнообразными струкурами и типами данных. Вот один из примеров рельной проблемы:

> TClass1 = class
> Object2: TObject; //требуется класс TClass2 но он объявляется
> позже
> end;
> TClass2 = class
> Objtct1: TClass1;
> end;

Как её обычно решают. Это выглядит как циклическая ссылка. Но я же могу сделать чтобы она таковой не была!!?


Игорь Шевченко   (2010-03-05 16:01:00) [28]

Я не могу понять а) в чем задача ? б) в чем проблема ?

Только не надо про классы и ObjectListы - это уже конкретная реализация, лучше про задачу с начала


Константин   (2010-03-05 15:31:00) [29]

Уважаемые мастера, вразумите меня пожалуйста


Константин   (2010-03-05 15:14:00) [30]

если это действительно так, то как тогда организовывать ссылки без приведения типов в таких случаях
TClass1 = class
Object2: TObject; //требуется класс TClass2 но он объявляется позже
end;
TClass2 = class
Objtct1: TClass1;
end;
Первое что приходит в голову так это в TClass2 сделать
proprety Object2: TClass2 read Get write Put;
и в методах доступа приводить тип, но так опять же не получиться по вышесказанной причине.
Что делать тогда?


Константин   (2010-03-05 14:56:00) [31]

это я типа ламер?
Надо хранить в TFirst  ссылки на объекты да? а управление их памятью оставит на SO и сортировать его как угодно.


Константин   (2010-03-05 14:22:00) [32]


> Или почему-то понадобились указатели на указатели?

допустим есть 3 классаъ
TFirst = class
 StoredObjectIndex1: Integer;
 StoredObjectIndex2: Integer;
 StoredObjectIndex3: Integer;
end;
TSecond = class
 StoredObjectIndex1: Integer;
 StoredObjectIndex2: Integer;

TAnyClass = class
 First: TFirst;
 Second: TSecond;

Все поля Integer указывают на  индекс в SO. Если я его (SO) отсортирую, то эти все поля будут указывать, не на те объекты. Поэтому надо синхронизировать. Или праильнее хранить не индексы а ссылки?


MBo   (2010-03-05 14:11:00) [33]

>Просто у меня есть структуры данных, каждая из которых должна указывать на исходные объекты

TObjectList и хранит ссылки на объекты (адреса, указатели)
при сортировке тела объектов остаются на месте, а меняются меcтами только указатели в списке.
Пример
список:

Петя 3-й переулок Навуходоносора 7
Вася ул. м. Бертольда Шварца 5

сортируем по номеру дома
Вася ул. м. Бертольда Шварца 5
Петя 3-й переулок Навуходоносора 7

Вася и Петя никуда не переехали, изменился лишь список.

Или почему-то понадобились указатели на указатели?


Константин   (2010-03-05 13:51:00) [34]


> но можно ввести свой метод сортировки.

что значит ввести? Переписать вызов у TList ?


Константин   (2010-03-05 13:50:00) [35]

блин, так можно сделать просто два TObjectList один хранит объекты как бы, а другой как бы только ссылки на них, без всяких индексов, ну и второй не может удалять объекты. Правильно?
Чё-то я вообще запутался. Просто у меня есть структуры данных, каждая из которых должна указывать на исходные объекты. При пересортировке объектов, надо синхронизировать ссылки на них в структурах данных. Хочется как то обойти этот гемор, тут надо что то типа наблюдателя.


MBo   (2010-03-05 13:48:00) [36]

>SortByIndexes я никак не смогу сделать методом класса, да?
Штатную функцию  сравнения - нельзя, но можно ввести свой метод сортировки.


Константин   (2010-03-05 13:41:00) [37]


> не сделает

а, не сделает в смысле будет как TList ? )))


Константин   (2010-03-05 13:39:00) [38]


> не сделает

а если я сделаю список объектов в TObjectList, таких
TIndex = class
public
 Index: Integer;
 StoreObjectLink: TStoredObject
 constructor Creater(PIndex: Integer; PStoreObj: TStoredObject);
 begin
   Index := PIndex;
   StoreObjectLink := PStoreObj;
 end;
end


и проинициализирую индексы
begin
SOI.Clear;
for i := 0 to SO.Count - 1 do
  SOI.Add(TIndex.Create(i, SO[i]));

?

так а SortByIndexes я никак не смогу сделать методом класса, да?


Игорь Шевченко   (2010-03-05 13:30:00) [39]


> а TObjectList.Create(False) же вроде не сделает таких проблем?


не сделает


Константин   (2010-03-05 13:24:00) [40]

а TObjectList.Create(False) же вроде не сделает таких проблем?
и всё равно SortByIndexes придётся выносить из класс как я понял да?


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо