|
Алгоритм преобразования дерева в таблицу | ☑ | ||
---|---|---|---|---|
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; " |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |