|
Как сравнить два дерева значений? | ☑ | ||
---|---|---|---|---|
0
Rizhij_Nikitos
26.07.21
✎
18:25
|
Есть дерево значений, которое используется в форме для красивого отображения и работы с данными. При сохранении я сворачиваю его в табличную часть и сохраняю документ. Соответственно при запуске документа, я разворачиваю ТЧ и отображаю красивое дерево.
Если сворачивать дерево в таблицу часто и на больших данных, это начинает занимать время. Я пытаюсь это кэшировать, но не могу найти подходящего способа. Сериализация дерева значений через СериализаторXDTO и ЗаписьXML выдает ошибку типа. Нельзя мол деревья. Использование общего модуля с повторным использованием возвращаемых значений не позволяет прокидывать в свои функции значения типа ДеревоЗначений. Если я создаю Соответствие, где ключом является ДеревоЗначений (сохраняю его в ХранилищеОбщихНастроек), получение по тому же дереву как по ключу, возвращает Неопределено. Гугл ничего интересного не предлагает и я если честно в некотором тупике. Готов выслушать ваши предложения. |
|||
1
mikecool
26.07.21
✎
18:30
|
сравнивай только ветви
|
|||
2
Rizhij_Nikitos
26.07.21
✎
18:33
|
Можно более развернуто?
|
|||
3
mikecool
26.07.21
✎
18:34
|
(2) сохраняй в памяти измененные строки дерева, сравнивай потом только их
|
|||
4
Rizhij_Nikitos
26.07.21
✎
18:42
|
(3) Меня интересует скорее вопрос, не равны ли два дерева? Есть ли какие-то изменения в дереве? Какие конкретно меня не волнует. Не равны, значит заново преобразую в таблицу и кеширую.
Но этот вариант навел меня на мысль, что на форме можно подвесить обработчик изменения дерева и при вызове функции свертки, определять, был ли он задействован. То есть если на форме дерево изменили, значит надо сворачивать заново, а если не изменили, то я могу отдать кешированную свертку и не тратить на это время. |
|||
5
mikecool
26.07.21
✎
18:43
|
"значит надо сворачивать заново" может проще при сохранении "свернуть" 1 раз?
|
|||
6
Rizhij_Nikitos
26.07.21
✎
18:44
|
(5) При сохранении я и так сворачиваю, меня больше волнует момент, когда человек поменял дерево, переключился на закладку с целевыми показателями, а мне их надо посчитать по текущему дереву.
|
|||
7
mikecool
26.07.21
✎
18:45
|
тогда булевый признак, сравнивать строку до и после изменения, если строки не равны , то взводи признак
|
|||
8
Rizhij_Nikitos
26.07.21
✎
18:47
|
Расчет показателей инкапсулирован и выполняется по табличному представлению дерева, чтобы можно было делать это не только из под формы, соответственно, когда я хочу посчитать показатели - из формы(по дереву) или извне(по табличному представлению дерева), я либо дерево преобразую к ТЗ и по нему считаю, либо ТЧ выгружаю в ТЗ и использую те же методы для расчета.
|
|||
9
vde69
26.07.21
✎
18:51
|
(4) кладёшь в двоичные данные, от них считаешь crc и сравниваешь с эталоном
|
|||
10
Rizhij_Nikitos
26.07.21
✎
18:55
|
(9) Я так понимаю, двоичные данные позволяют работать с файлами и потоками, которые источниками тоже являют собой файлы.
|
|||
11
H A D G E H O G s
26.07.21
✎
19:02
|
Древо1=Новый ДеревоЗначений;
Древо1.Колонки.Добавить("Данные"); Древо2=Новый ДеревоЗначений; Древо2.Колонки.Добавить("Данные"); Древо3=Новый ДеревоЗначений; Древо3.Колонки.Добавить("Данные"); НоваяСтрока=Древо1.Строки.Добавить(); НоваяСтрока.Данные="Ооооо, моя оборона"; НоваяСтрока=Древо2.Строки.Добавить(); НоваяСтрока.Данные="Солнечный лучик стеклянного глаза"; НоваяСтрока=Древо3.Строки.Добавить(); НоваяСтрока.Данные="Ооооо, моя оборона"; Сообщить(ЗначениеВСтрокуВнутр(Древо1)=ЗначениеВСтрокуВнутр(Древо2)); Сообщить(ЗначениеВСтрокуВнутр(Древо1)=ЗначениеВСтрокуВнутр(Древо3)); |
|||
12
Rizhij_Nikitos
26.07.21
✎
19:38
|
(11) Победителя этому господину. Я уже переделал на ручной трекинг изменения дерева, но с этой штукой кэш заработал бы в своем первоначальном виде. Спасибо, не знал про такую функцию.
|
|||
13
TormozIT
гуру
26.07.21
✎
20:17
|
(12) И сериализатором бы ты дерево сравнил, но у тебя в нем очевидно есть доп. колонки, которые ты не хранишь в БД, а достраиваешь для отображения. Вот их и надо было удалить перед сериализацией.
А функция ЗначениеВСтрокуВнутр() хороша и одновременно плоха (смотря для чего) тем, что игнорирует несериализуемые данные и превращает их в идентификатор типа. |
|||
14
nodrama
26.07.21
✎
20:40
|
выгрузить оба в эксель и сравнить там не предлагать?)
|
|||
15
nodrama
26.07.21
✎
20:41
|
(14) глупость сказал, думал что разово надо))
|
|||
16
ДедМорроз
26.07.21
✎
20:42
|
А что так сложно преобразовать дерево в таблицу?
И потом,если пользователь чего-то меняет из данных,то проще сразу проставить флаг изменения. При желании,можно при изменении сразу модифицировать таблицу. Ну и любителям ЗначениеВСтроку и др.сериализаций - печаль вас настигнет,когда в двух ветвях будут ссылки на одну и ту же структуру. А уж про самовложенность с вытекающим срывом стека мы помолчим. |
|||
17
H A D G E H O G s
26.07.21
✎
20:45
|
(16) Вот как самовложенность произойдет - тогда и приходите.
|
|||
18
ДедМорроз
26.07.21
✎
22:14
|
Да зачем мне приходить.
php и с самовложенностью и с множественной вложенностью работает на ура. Просто,сохранить граф в xml задача непростая. |
|||
19
fisher
27.07.21
✎
10:33
|
(0) Просто прекрати делать это часто и всех делов. При открытии рассчитывай дерево а в процессе работы поддерживай актуальными одновременно два представления.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |