Как правильно заполнить / перемещаться по этой древовидной структуре, используя строки пути?

#c #algorithm #xpath #tree #unreal-engine4

#c #алгоритм #xpath #дерево #unreal-engineer4

Вопрос:

Обновить:

Оказывается, я напрасно все усложнял. Для целей контекстного меню вам действительно нужно только произвольное дерево (с Parent , FirstChild и NextSibling ). Лучший способ визуализировать дерево для контекстного меню — это точно так же, как любое другое дерево, но с разветвлением по горизонтали, а не по вертикали. На самом деле никогда не нужно иметь возможность перемещаться по дереву в 4 разных направлениях ( Up , Down , Left и Right ), потому что вся необходимая вам информация уже есть с помощью Parent , FirstChild и NextSibling (все это довольно легко определить, если у вас уже есть список строк путей).

Этот поток можно безопасно закрыть.


Я не использую XPath или какие-либо библиотеки, связанные с web или DOM, но я хотел бы использовать средства в стиле XPath для заполнения содержимого виджета контекстного меню:

 struct ContextMenuNode
{
    ContextMenuNode* Left; // Parent Menu
    ContextMenuNode* Right; // Sub Menu
    ContextMenuNode* Up; // Previous Sibling
    ContextMenuNode* Down; // Next Sibling
    FString Path; // An XPath-like string
    FString Caption; // Display text of this menu item
}
  

То, что я хотел бы сделать, это что-то вроде этого:

 // Defined in a class declaration:
TArray<ContextMenuNode*> MenuNodes;

// ...

/* This should create 2 unique nodes ("/File" doesn't exist yet within MenuNodes),
establish Left amp; Right relationships between them, and
return the newly created "/File/Open" node,
adding both nodes into MenuNodes
*/
auto openFileNode = AddNode("/File/Open");

/* Much like the previous line, this should
create 1 unique node (since "/File" should already exist from the previous call),
Left should be "/File", Up should be "/File/Open".
But also, we need to update THOSE nodes in relation to this node now...
Both "/File/Open" and "/File/Save" are Up/Down siblings with the same Left ("/File")
*/
auto saveFileNode = AddNode("/File/Save");
  

Как этого можно достичь, или есть просто лучший способ сделать это?

Полезные ссылки для тех, кто не знаком с UE4:

Комментарии:

1. Вы можете достичь этого, взяв то, что вы записали на английском языке, и вместо этого записать это в коде …?

2. @immibis Вау, никогда не думал попробовать это. Спасибо! Это почти так, как если бы мне никогда не нужно было приходить сюда в первую очередь! </сарказм>

3. Что ж, похоже, у вас есть представление о том, что вам может понадобиться сделать. Вы пробовали это делать? С какими проблемами вы столкнулись?

4. Я немного запутался, с чего вообще начать, если рекурсия вообще необходима, или что именно я должен отслеживать при попытке обхода. С помощью FString::ParseIntoArray я могу разбить строку пути на массив, чтобы подсчитать его глубину, но тогда как мне узнать, что обновлять (в том, что касается отношений)?

5. Итак, в целом, я предполагаю, что это сводится к правильным алгоритмам разбора дерева… Но она недвоичная, четырехнаправленная и использует строку для определения ее взаимосвязей, что делает ее еще более запутанной