![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
аналог Set Of [D7, XP]
Вася © (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 :)