Тема: Маніпуляції з деревом елементів
Вітаю.
Нехай у нас є набір елементів, котрі можуть бути двох типів:
1. Простий елемент
2. Секція, що може містити інші елементи
Відпочатку всі елементи знаходяться на рівні 1, але якщо ми беремо простий елемент, і вставляємо його в секцію, то цей простий елемент отримує рівень ( рівень_секції + 1 ), і тепер ми можемо розкривати, або згортати цю секцію, що, відповідно, показує та приховує простий елемент, котрий в ній знаходиться.
І ось деякі правила:
1. Секція може містити як прості елементи, так і інші секції, що також можуть мати вкладені елементи
2. Ми можемо перетягувати елементи з одного рівня, на інший, наприклад, пернести простий елемент, що знаходиться в секції, на один рівень з самою секцією, після чого та секція вже не містить той елемент, і, відповідно, не може приховувати, або згортати його.
3. Ми можемо перетягувати з рівня на рівень самі секції, і тоді сама секція і її вкладені елементи переміщуються разом з нею, при цьому їхні індекси та рівні змінюються відповідно.
4. Ми можемо додавати нові прості елементи, і секції.
5. Ми можемо видаляти прості елементи і секції, при цьому, якщо ми видаляємо секцію, то й всі елементи і секції, котрі вона містить, теж видаляються.
Код, котрий будує дерево, отримує на вхід простий масив з елементів, кожен з котрих має позначку - секція це, чи простий елемент, та значення рівня.
Наприклад, у нас є такий масив
Секція: рівень 1
Елемент: рівень 2
Елемент: рівень 2
Елемент: рівень 2
Секція: рівень 2
Елемент: рівень 3
Елемент: рівень 3
Секція: рівень 1
Секція: рівень 2
Елемент: рівень 3
Елемент: рівень 3
Елемент: рівень 1
Елемент: рівень 1
Ми побачимо ось таку картину, коли розкриємо всі секції.
(прикріпив).
На початку (коли секції згорнуті) мій код побудує ось такий масив
Елемент дерева: Секція, рівень: 1, дітки: [Елемент, рівень 2(x3), Секція, рівень: 2, дітки: [Елемент, рівень 3(x2)]]
Елемент дерева: Секція, рівень 1, дітки: [Секція, рівень: 2, дітки: [Елемент: рівень 3(x2)]]
Елемент дерева: Елемент, рівень 1
Елемент дерева: Елемент, рівень 1
і поверне мені його назад, і з нього я створю 4 елементи на сторінці, з котрими користувач зможе взаємодіяти.
Як воно працює зараз:
Нехай у нас є невелика кількість секцій, кожна з котрих містить велику кількість елементів включаючи інші секції, що теж містять інші елементи. Ми розгортуємо всі секції, і наше дерево показує нам всі можливі елементи.
Коли я розгортаю певний елемент, то я додаю його ID в Set.
Потім, скажімо, ми хочемо додати ще один елемент в наше дерево. На вхід коду, що будує дерево, надходить новий масив з елементами, і він спочатку будує дерево таким чином, що всі його секції згорнуті, а потім він перевіряє Set, і якщо там є якісь ID - то він починає шукати ці елементи (а це секції) в нашому вже обробленому масиві, і використовуючи поле "дітки", додавати дітей кожної такої секції до вже існуючого масиву, у відповідні місця, після чого цей масив повертається назад, і я вже малюю всі елементи, а це і секції, і вкладені в ці секції елементи.
Проблема:
Коли вкладених елементів багацько, то при додаванні, видаленні елементів, або при зміні структури дерева, воно отримує на вхід новий масив, і занов будує всю структуру, після чого розкриває необхідні секції, і чим більше у нас елементів, тим більше часу це займає, до моменту, коли нам доводиться чекати секунд 5, а то й більше, аби додати простий елемент.
Питання:
Чи можна якось спростити це завдання? Адже, якщо ми додаємо 1 новий елемент в кінець дерева, то нам непотрібно перебудовувати все дерево. І один цей кейс я б зміг сам зробити, але треба ще брати до уваги додавання елементів десь всередині дерева, видалення цих елементів, і просто зміну рівня елементів, коли ми перетягуємо їх з рівня на рівень, а бо ж просто міняємо місцями два елемента.