Получение элемента из TList

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Получение элемента из TList

Сообщение Brainenjii » 13.08.2007 19:36:01

В общем, есть ли какой-нибудь способ, получить объект из TList'a по свойству этого объекта ? Т.е.
Код: Выделить всё
Type TItem = class
  Private
    FID: Integer;
    FValue: String;
  Public
    Property ID: Integer Read FID;
    Property Value: String Read FValue Write FValue;
    Constructor Create(C_ID: Integer);
End;

Вот, как получить TItem из TList'a по ID ? Я делаю перебором, но это довольно медленно получается, когда много... ID - уникально по логике...
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Сообщение shade » 13.08.2007 22:24:06

Замени TList на TCollection
Аватара пользователя
shade
энтузиаст
 
Сообщения: 879
Зарегистрирован: 21.02.2006 20:15:48
Откуда: http://shamangrad.net/

Сообщение Brainenjii » 13.08.2007 23:36:51

Там что-то странное... Во-первых, простой перебор, а во-вторых - не работает ^_^ По-крайней мере так, как написано...
FindItemID searches through the collection for the item that has a value of ID for its TCollectionItem.ID property, and returns the found item. If no such item is found in the collection, Nil is returned.

The routine performs a linear search, so this can be slow on very large collections.

А в collect.inc:
Код: Выделить всё
function TCollection.FindItemID(ID: Integer): TCollectionItem;
Var
          I : Longint;
begin
  Result:=Nil;
  For I:=0 to Fitems.Count-1 do
   begin
     Result:=TCollectionItem(FItems.items[I]);
     If Result.Id=Id then
       exit;
   end;
end;
И если с нужным ID там не будет - вернется не nil, а последний элемент коллекции...
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Сообщение shade » 14.08.2007 10:45:30

Действительно, в багрепорт
Result:=Nil; нужно было перенести в конец процедуры.

Тогда проще унаследовать от TList и добавить соответствующий метод...
Аватара пользователя
shade
энтузиаст
 
Сообщения: 879
Зарегистрирован: 21.02.2006 20:15:48
Откуда: http://shamangrad.net/

Сообщение Brainenjii » 15.08.2007 13:51:02

Так и делаю... Просто думал, вдруг есть какой-нить классический алгоритм для этого, а я, по причине неопытности, не знаю ^_^ Но видимо нет...
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Сообщение shade » 16.08.2007 16:32:10

Brainenjii писал(а):Так и делаю... Просто думал, вдруг есть какой-нить классический алгоритм для этого

TList - список "тупых" указателей, он - прото не может ничего знать о хранимых объектах.

Если по каким-то причинам наследование невозможно или переписываение занимает много времени, а сроки горят, то, как вы уже догадались, на скорую руку пишется маленькая процедурка:
Код: Выделить всё
function lookup_item(list: TList, ID: Integer): TItem;
var i, count: Integer;
begin
count := list.count;
for i := 0 to count-1 do
begin
  Result := TItem(List[i]);
  if Result.ID = ID then Exit(Result);
  Result := nil;
end;
Аватара пользователя
shade
энтузиаст
 
Сообщения: 879
Зарегистрирован: 21.02.2006 20:15:48
Откуда: http://shamangrad.net/

Сообщение Brainenjii » 16.08.2007 17:01:39

я бы вынес "Result := nil;" из цикла, но спасибо :)
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Сообщение Astralis » 23.08.2007 15:40:46

Наиболее оптимальным в похожих случаях было написать потомка Tcollection, который бы имел методы QuickSort и BinarySearch.
При этом вполне естественным было бы задание метода Compare для класса TItemSortСollection, который бы давал три возможные значения -1, 0, +1 для случаев больше, меньше и равно. Естественно что этот метод является виртульным.
Но в отличие от object pascal в freepascal возможна перегрузка операторов >,<,=. На что резонно возникает вопрос - а может ли перегрузка данных операторов быть виртуальной?
Аватара пользователя
Astralis
новенький
 
Сообщения: 45
Зарегистрирован: 06.06.2007 20:33:05
Откуда: Tvercity-Annet

Re: Получение элемента из TList

Сообщение PapaNT » 25.11.2014 09:15:04

В свое время изучал МВК Эльбрус. В нем была одна шикарная вещь: каждая ячейка ОЗУ содержала в себе тег отражающий тип хранимых данных (там было процедурное программирование, а не ООП).

Сейчас, ваяя систему поддержки стендов сопровождения столкнулся с тем, что без тегов не смогу решить задачу, но при этом тег является скрытым свойством объекта (строка, картинка, выпадающий список, переключатель и т.д., но взаимоорганизованных по принципу дерева). Не думаю что моя задача столь уникальна по сути, но очень не хватает визуальной компоненты-обертки для обеспечения удобного интерфейса пользователя (сам междумордия рисую крайне редко, всё больше с командной строчкой заморачиваюсь).
PapaNT
постоялец
 
Сообщения: 167
Зарегистрирован: 11.09.2009 12:06:46
Откуда: Москва

Re: Получение элемента из TList

Сообщение Sharfik » 25.11.2014 12:25:23

Так какой вопрос
Аватара пользователя
Sharfik
энтузиаст
 
Сообщения: 809
Зарегистрирован: 20.07.2013 01:04:30


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 221

Рейтинг@Mail.ru