Имя: Пароль:
IT
 
Алгоритм преобразования дерева в таблицу
0 akaBrr
 
22.08.12
11:12
Ищется сабж, без привязки к конкретному языку. Бросьтесь ссылкой, пожалуйста.
1 Irbis
 
22.08.12
11:13
плоская таблица с колонкой родитель, не?
2 Жан Пердежон
 
22.08.12
11:14
алгоритм обхода дерева? мде
3 akaBrr
 
22.08.12
11:15
(1) минуту, сейчас попробую реализовать
4 akaBrr
 
22.08.12
11:16
(2) вот такой я тупой, не жмитесь, делитесь знаниями
5 akaBrr
 
22.08.12
11:17
Цель, преобразовать xml файл произвольного вида(выгрузка документа) в таблицу
6 iceman2112
 
22.08.12
11:18
А как ты видишь таблицу для дерева:
Р1
 П1
 П2
 П3
Р2
 П5
   K8
   K2
 П6
?
7 akaBrr
 
22.08.12
11:20
(6) вижу так:
Р1 П1
Р1 П2
Р1 П3
Р2 П5 К8 К2
Р2 П6
8 akaBrr
 
22.08.12
11:22
+(7) а если как в (1)
Р1 П1
Р1 П2
Р1 П3
Р2 П5
П5 К8
П5 К2
Р2 П6

утро, не проснулся еще :(
9 ДемонМаксвелла
 
22.08.12
11:26
10 Lama12
 
22.08.12
11:26
(8) Варианта из (1) должно хватить для восстановления из таблицы - дерева.
Вариант из (7) удобно читабелен человеку.
Что нужно-то?
11 akaBrr
 
22.08.12
11:27
(10) в идеале вариант (7), вот думаю из (1) его можно как-то получить?
12 akaBrr
 
22.08.12
11:28
(9) читал, не то, см. (6)
13 Irbis
 
22.08.12
11:29
(11) Можно но сначала придётся определить максимальный уровень вложенности, чтобы количество колонок определить
14 akaBrr
 
22.08.12
11:32
(13) это сделать легко, опираясь на то что xml есть теги :), если тег содержит значение, то его используем как колонку в таблице, соответственно добавляем если колонки нет
15 akaBrr
 
22.08.12
11:32
+(14) проблема заполнить таблицу как в (7)
16 akaBrr
 
22.08.12
11:32
или я просто туплю, простите
17 akaBrr
 
22.08.12
11:38
Пример:
DS
D
 H
  FC
  FI
  N
 PS
  P
   C
   A
  P
   C
   A
18 akaBrr
 
22.08.12
11:39
Вижу как
DS D H FC FI N PS P C A
DS D H FC FI N PS P C A
19 akaBrr
 
22.08.12
11:39
Э, неудачный пример :(
20 Irbis
 
22.08.12
11:41
(15) Если я правильно понял, тебе нужно добираться до "листочка" (ветки в которой нет больше ничего) и только такие листочки складывать в таблицу. А дальше сортировка
21 akaBrr
 
22.08.12
11:43
(20) в (18) ветка Н является "началом" ветки PS
22 akaBrr
 
22.08.12
11:45
+(21) и ветка PS лежит не в Н, а в D
23 Ursus maritimus
 
22.08.12
11:45
(0) Цель какая этого действа? Перебрать строки циклом без рекурсии? Или что?
24 akaBrr
 
22.08.12
11:45
самое интересное что эксель так умеет
25 akaBrr
 
22.08.12
11:46
(23) цель уложить в таблицу дерево, рекурсия или нет - пофигу
26 akaBrr
 
22.08.12
11:48
я так думаю, нужно установить связь между колонкой таблицы и путем по которому получается значение, получается двухпроходной алгоритм, сначала создаем колонки и фиксируем связи, потом заполняем таблицу
27 Ursus maritimus
 
22.08.12
11:50
(25) Хорошо. Чем тебе дерево не таблица? Какие у таблицы свойства и методы, которых нет у дерева? Чего в дереве не хватает?
28 Irbis
 
22.08.12
11:53
(21) Значит не понял, но тогда в 18 не содержится строк для отдельных листочков из веток верхнего уровня
29 akaBrr
 
22.08.12
11:54
(27) ну у дерева разной длинны ветки, и в общем случае в узлах могут лежать не соответствующие друг другу данные, обсуждается дерево не из 1С 8
30 akaBrr
 
22.08.12
11:55
(28) да, интересно как это микрософтовцы сделали
31 fedoss
 
22.08.12
12:02
Функция РазобратьУзел(ТекущийУзел, Уровень, ТЗ)
   ТЗ.НоваяКолонка();
   Уровень = Уровень + 1;
   ВсегоДобавленоСтрок = 0;
   Если ЕстьПодчиненныеУзлы Тогда
       Для Каждого ПодчиненныйУзел Из ТекущийУзел Цикл
           ДобавленоСтрок = РазобратьУзел(ПодчиненныйУзел, Уровень, ТЗ);
           ВсегоДобавленоСтрок = ВсегоДобавленоСтрок + ДобавленоСтрок;
       КонецЦикла
       ТЗ.Заполнить(ЗначениеТекущегоУзла, ТЗ.КоличествоСтрок() - ВсегоДобавленоСтрок + 1, ТЗ.КоличествоСтрок(), Уровень);
       Возврат ВсегоДобавленоСтрок;
   Иначе
       ТЗ.НоваяСтрока();
       ТЗ.УстановитьЗначение(ТЗ.НомерСтроки, Уровень, ЗначениеТекущегоУзла);
       Возврат 1;
   КонецЕсли;
КонецФункции

ТЗ = СоздатьОбъект("ТаблицаЗначений");
РазобратьУзел(Корень, 0, ТЗ);
32 akaBrr
 
22.08.12
12:06
(31) класс, спасибо
33 GANR
 
22.08.12
12:34
(0)Вот так нужно обходить дерево:

СтекВызовов = Новый Массив;    
СтекВызовов.Добавить(Новый Структура("НаборСтрок, Курсор", ТвоеДерево.Строки, 0));
Пока СтекВызовов.Количество() <> 0 Цикл
   ТекущиеПараметры = СтекВызовов[СтекВызовов.Количество()-1];
   Если ТекущиеПараметры.Курсор <= ТекущиеПараметры.НаборСтрок.Количество() - 1 Тогда
       ДочернийНабор = ТекущиеПараметры.НаборСтрок[ТекущиеПараметры.Курсор].Строки;
       ТекущиеПараметры.Курсор = ТекущиеПараметры.Курсор + 1;
       // здесь строить ТЗ
       Если ДочернийНабор.Количество() <> 0 Тогда    
           СтекВызовов.Добавить(Новый Структура("НаборСтрок, Курсор", ДочернийНабор, 0));
       КонецЕсли;
   Иначе
       СтекВызовов.Удалить(СтекВызовов.Количество()-1);
   КонецЕсли;
КонецЦикла;

Ну а как получить текущий и родительский узлы в точке "// здесь строить ТЗ" - придумайте сами :-).
34 GANR
 
22.08.12
12:35
+(33) Пардон, ТЗ надо строить перед строчкой
"ТекущиеПараметры.Курсор = ТекущиеПараметры.Курсор + 1; "
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший