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

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

аналог Set Of [D7, XP]


Страницы:   1 2

Вася ©   (2010-01-28 11:19:00) 

Уважаемые Мастера,
Посоветуйте аналог SET OF такой, чтобы значения элементов множества могли быть больше 255 (например, [1,5,100,3560]).

Плюс к тому, чтобы можно было изящно (без перебора элементов) проверить, входит ли значение некой переменной i в это множество.

По аналогии с set of:
If i in MySet then...


Jeer   (2010-01-29 09:13:00) [1]

На самом деле, лично для меня, появление вот таких задач, это, скорее всего, следствие ошибочной, не оптимальной архитектуры системы обработки и представления данных.
Ну да ладно - предположим в ней уже ничего менять нельзя.

Однако, если верно определение, что список уникальных id в Tree является подмножеством эквивалентных id в таблице, то задачу можно свести точно к линейной от N, а заодно и ускорить:

select * from table order by id

// Имеется список объектов, каждый из которых имеет свойства: id: integer, node: TTreenode и признак наличия в таблице БД: boolean;

// Для начала формируем из Tree линейный список
while not tree.eof do begin
 lst.Add(id,tree.node,False);
 tree.next;
end;

lst.Sort; // сортировка списка по id

// Сканируем список, а внутри - двухпозиционный автомат
// В итоге получаем "раскрашенный" список всех id
// Что делать дальше с ним - забота автора

while lst.eof do begin
 while ( lst.id <> table.id ) do table.next;
 while ( tree.item.id = table.id ) do begin
    lst.set; // установка признака в True
    lst.next;
 end;
end;


Евгений Р.   (2010-01-29 01:09:00) [2]

Ну можно и так


Anatoly Podgoretsky   (2010-01-29 00:54:00) [3]

> Евгений Р.  (29.01.2010 00:47:28)  [28]

Автор сам рамки поставил по диапазону Integer
Наша дело посчитать


Евгений Р.   (2010-01-29 00:47:00) [4]

Повторюсь:
Исходя из обсуждаемого вопроса ([15] Надо: выделить все узлы дерева, у которых... ), вряд ли количество элементов превысит тысячу. При нескольких тысячах записей предложенный алгоритм работает нормально. Не думаю, что автор пишет телефонный справочник Европы и хочет всех абонентов отобразить на одном экране


Anatoly Podgoretsky   (2010-01-29 00:30:00) [5]

> Евгений Р.  (29.01.2010 00:17:26)  [26]

Ну попробуй, возьми десятую долю от диапазона, а это 400 000 000 чисел и попробуй добавить это в список, не обращая внимания на время. И посмотрим выживет ли или нет.


Евгений Р.   (2010-01-29 00:17:00) [6]

Сопоставив конкретизацию вопроса автора [15] и Вашу реплику: "Не доживет и до десятой доли диапазона Integer". Или Вы о чем-то другом говорили?


Anatoly Podgoretsky   (2010-01-28 23:46:00) [7]

> Евгений Р.  (28.01.2010 23:14:24)  [24]

Я ничего не говорил про дерево и про его показ, с чего бы ты это приплел?


Евгений Р.   (2010-01-28 23:14:00) [8]


> Anatoly Podgoretsky ©   (28.01.10 21:30) [23]


Неужели пользователю стоит показывать дерево с таким количеством листов?


Anatoly Podgoretsky   (2010-01-28 21:30:00) [9]

> Евгений Р.  (28.01.2010 20:56:22)  [22]

Не доживет и до десятой доли диапазона Integer


Евгений Р.   (2010-01-28 20:56:00) [10]

var sl:tStringList;

.........
sl.sorted:=true;

sl.add(IntToStr(n));

............

if sl.find(IntToStr(n),k) then ......


Вася   (2010-01-28 17:30:00) [11]


> Попробуй сканировать дерево и делать locate по базе

Да, в моем случае это, пожалуй, наиболее приемлемый вариант. Спасибо!


Jeer   (2010-01-28 17:26:00) [12]

Странно но ладно.
Попробуй сканировать дерево и делать locate по базе.


Вася   (2010-01-28 17:20:00) [13]


> А у тебя что за соответствие

А у меня один id из набора данных может соответствовать нескольким узлам дерева. Отношение "один ко многому".


Jeer   (2010-01-28 17:05:00) [14]


> давайте я попытаюсь четко сформулировать задачу.


Обычно Tree является подмножеством выбранных записей и в этом случае id записи имеет один id в Tree.
Т.е. дерево строится как иерархическое представление линейной таблицы БД.

А у тебя что за соответствие ?


Anatoly Podgoretsky   (2010-01-28 16:44:00) [15]

> Вася  (28.01.2010 16:06:14)  [14]

Известно заранее, это или High(Integer) или High(Cardinal)  максимальнее этого быть не может.


Anatoly Podgoretsky   (2010-01-28 16:43:00) [16]

> Jeer  (28.01.2010 15:28:12)  [12]

Я вообще про доступ по индекс говорил


Вася   (2010-01-28 16:24:00) [17]

Если вопрос вызвал интерес, давайте я попытаюсь четко сформулировать задачу.

Дано:
- Есть некий набор данных table1, откуда берётся значение поля ID
- Есть дерево, в Data каждого элемента также которого храниться значение ID

Надо: выделить все узлы дерева, у которых ID соответствует одному из ID из table1.

Понимаете, очень хочется уйти вот от этого:


while not table1.eof do
 begin
    for i:=0 to TreeView.Items.Count-1 do
      if table1.ParamByName('ID').asInteger=Integer(TreeView.Items[i].Data)
        then begin
          // нашли, сохранили ссылку на найденный TTreeNode в массиве
           breake
       end;
    table1.next
 end;
TreeView.Select(массив с найденными узлами);


Вася   (2010-01-28 16:06:00) [18]

Мастера, ага. В множество должны добавляться значения поля типа AUTOINC из таблицы. Т.е. заранее невозможно угадать, каким будет максимальное значение элемента множества.


Jeer   (2010-01-28 15:30:00) [19]


> Не то. В предполагаемом множестве нужно хранить совершенно
> конкретные integer-числа.


Я понимаю, конечно, что заради общности можно упираться в края диапазона, а как там у него на самом деле - он и знает.
Да и вообще - какой-то намек на Tree  - может и совсем по другому задача может быть решена.


Jeer   (2010-01-28 15:28:00) [20]

> например, [1,5,100,3560]

Это еще не integer :)


Страницы:   1 2

Наверх

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