![]() |
![]() |
|
Как получить все данные из дерева значений? | ☑ | ||
---|---|---|---|---|
0
djkitybr
05.06.08
✎
14:06
|
Доброе.. уважаемые..
У меня простой и наверное банальный вопрос. Как получить все данные из дерева значений неограниченной вложенности? В поиск прошу не посылать. Сразу туда ходил.. Но ничего не нашел кроме как использовать поиск. Помогите построить такую рекурсивную выборку (обход) дерева значений |
|||
1
Fragster
гуру
05.06.08
✎
14:09
|
Процедура ВывестиСтрокуИПодчиненные(Стр,Отступ = "")
Сообщить(Отступ+Стр.«что-нибудь»); Для каждого Подч из Стр Цикл ВывестиСтрокуИПодчиненные(Подч, Отступ+" "); КонецЦикла КонецПроцедуры ну, или что-то типа того. Чтобы понять рекурсию, надо понять рекурсию! |
|||
2
чувак
05.06.08
✎
14:10
|
Это справочник?
|
|||
3
Stepa86
05.06.08
✎
14:11
|
Функция ПрочитатьЗначениеСтрокиДерева(пСтрокаДерева, пТабличко)
Для Каждого цСтрока Из пСтрокаДерева Цикл НовСтр = пТабличко.Добавить(); НовСтр.Значение = цСтрока.Значение; ПрочитатьЗначениеСтрокиДерева(цСтрока, пТабличко); КонецЦикла; КонецФункции |
|||
4
Stepa86
05.06.08
✎
14:12
|
Обход в ширину сам пиши =)
|
|||
5
djkitybr
05.06.08
✎
14:12
|
нет. не справочник. Это маршрутная карта, составленная как дерево значений.
|
|||
6
Stepa86
05.06.08
✎
14:14
|
+ (3) вместо Для Каждого цСтрока Из пСтрокаДерева Цикл
читать Для Каждого цСтрока Из пСтрокаДерева.Строки Цикл |
|||
7
Stepa86
05.06.08
✎
14:15
|
к (1) это тоже относится ;)
|
|||
8
Fragster
гуру
05.06.08
✎
14:15
|
(6) о, точно, «.строки»
|
|||
9
ЗлобнийМальчик
05.06.08
✎
14:17
|
(0) для вас принципиальна рекурсия - или итерация тоже пойдёт??
|
|||
10
djkitybr
05.06.08
✎
14:19
|
(9)ограничена вложенность. Поэтому итерация врядли здесь уместна.
но если не сложно выложите. интересно как это делает итерационно |
|||
11
Fragster
гуру
05.06.08
✎
14:25
|
если организовать стек родителей, то теоретически можно в цикле обработать... но это будет долго, и потом хрен отладишь, а через пол года когда туда взглянешь, воскликнешь: какого хухя я это не через рекурсию сделал?!?!?
|
|||
12
Stepa86
05.06.08
✎
14:30
|
добавляешь в дерево недоступную колонку типа булево и МоеДерево.Строки.НайтиСтроки(Новый Структура("СпецКоллонка", Ложь), Истина) вернет массив всех строк
|
|||
13
Рассада
05.06.08
✎
14:34
|
А через Построитель, а потом выгрузить в таблицу?
|
|||
14
Scooter
05.06.08
✎
14:34
|
а разве построитель деревья не курит?
|
|||
15
Smallrat
05.06.08
✎
14:49
|
была у меня такая проблема - надо было посмотреть что находится в ветке дерева значений. само дерево доступно не было, а у ветки нету метода ВыбратьСтроку(). В итоге пришлось написать выгрузку ветки в дерево.
|
|||
16
ЗлобнийМальчик
05.06.08
✎
14:57
|
пусть ГлавныйРодитель - корневой элемент
тогда напишем кривой итерационный код который мне в силу глубокого нежелания грузить стэк нравится больше МассивГотовых = Новый массив; Пока истина цикл МассивПотомков = главныйРодитель.ПолучитьПотомков(); Для каждого Элемент из массивпотомков цикл МассивГотовых.Добавить(Элем); ПромежуточныйМассивПотомков = Загрузить(Элем.получитьПотомков()); конецЦикла МассивПотомков = промежуточныйМассивПотомков; Если Массивпотомков.количество() = 0 тогда Прервать конецЕсли конецЦикла что то вроде такого. Писал навскидку багов не исключаю, но вроде бы существует теорема о том что любой рекурсивный метод можно реализовать итерационно |
|||
17
ЗлобнийМальчик
05.06.08
✎
14:59
|
ой))) надо чуть чуть по другому
МассивГотовых = Новый массив; МассивПотомков = главныйРодитель.ПолучитьПотомков(); Пока истина цикл Для каждого Элемент из массивпотомков цикл МассивГотовых.Добавить(Элем); ПромежуточныйМассивПотомков = Загрузить(Элем.получитьПотомков()); конецЦикла МассивПотомков = промежуточныйМассивПотомков; Если Массивпотомков.количество() = 0 тогда Прервать конецЕсли конецЦикла |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |