У нас есть древовидная структура, реализованная с использованием DefaultMutableTreeNode
, указанного в Java.Дерево обхода из DefaultMutableTreeNode
Есть ли способ его пересечения, который встроен?
Если нет, предложите другие методы.
У нас есть древовидная структура, реализованная с использованием DefaultMutableTreeNode
, указанного в Java.Дерево обхода из DefaultMutableTreeNode
Есть ли способ его пересечения, который встроен?
Если нет, предложите другие методы.
Если вы хотите пройтись по дереву, вы можете позвонить breadthFirstEnumeration()
или depthFirstEnumeration()
, чтобы перебрать все узлы в дереве.
Пример:
DefaultMutableTreeNode root = ...
Enumeration en = root.depthFirstEnumeration();
while (en.hasMoreElements()) {
// Unfortunately the enumeration isn't genericised so we need to downcast
// when calling nextElement():
DefaultMutableTreeNode node = (DefaultMutableTreeNode) en.nextElement();
}
Как получить доступ к каждому узлу, который был возвращен алгоритмом поиска? Можете ли вы указать мне хороший ресурс, пожалуйста. – fixxxer
Я только что добавил пример кода. – Adamski
Наконец-то мне нужно! Я использовал ArrayList, который добавил к ним узлы, поскольку я их создал, и это было хорошо, но поскольку я использую дублированные записи в разных папках, мне нужен новый массив для каждой папки, а затем он становится очень быстрым. Кроме того, благодаря ответу ниже я могу обрабатывать их в 2 раза быстрее! – Daedric
Правильно, breadtFirst является Симметричным. Предзаказ (первый корень, то дети) также поддерживается (preorderEnumeration)
Вы теоретически четыре способа обхода дерева от узла (DefaultMutableTreeNode
):
breadthFirstEnumeration
depthFirstEnumeration
preorderEnumeration
postorderEnumeration
, но на самом деле глубина сначала реализована как заказчик.
JavaDoc немного отличается от различий в этих методах. Я пришел сюда в поисках ответа, но я закончил, выполнив тест сам, с кодом выглядит как:
TreeModel model = tree.getModel();
DefaultMutableTreeNode rootNode = (DefaultMutableTreeNode) model.getRoot();
// Just changing enumeration kind here
Enumeration<DefaultMutableTreeNode> en = rootNode.preorderEnumeration();
while (en.hasMoreElements())
{
DefaultMutableTreeNode node = en.nextElement();
TreeNode[] path = node.getPath();
System.out.println((node.isLeaf() ? " - " : "+ ") + path[path.length - 1]);
}
Я мог бы уточнить с отступом, пропорциональным уровень, но это было просто быстро взломать.
Итак, в чем отличия?
preorderEnumeration
= от вершины дерева вниз, как если бы вы использовали стрелку вниз, чтобы пройти егоpostorderEnumeration
= depthFirstEnumeration
= первый список наиболее глубокие листья первого пути, то их родителей, то самое глубокое листья второго пути и т. д.breadthFirstEnumeration
= список на первом уровне элементов, то элементы на втором уровне, и так далееЧтобы быть более конкретным:
+ Root
+ Folder 1
- Leaf F1
- Leaf F1
+ Folder 2
+ Sub-folder 1
- Leaf SF1
- Leaf SF1
+ Sub-folder 2
- Leaf SF2
- Leaf SF2
♦ Предзаказ: как показано выше
♦ DepthFirst/Postorder:
Лист F1, Лист F1, скоросшиватель 1
Leaf SF1, Leaf SF1, подпапка 1
Лист SF 2, Leaf SF2, Суб-папка 2 , Папка 2, Root
♦ BreathFirst:
Root
Folder 1, Папка 2
Лист F1, Лист F1, Суб-папки 1, Суб-папка 2
Лист SF 1, Лист SF 1, Лист SF 2 , Leaf SF 2
Вот еще одно описание 3 перечисляющих методов, которые могут быть проще понять.
en = root.breadthFirstEnumeration();
//Enumeration lists all nodes at depth 0 (aka root)
//Then all nodes at depth 1 (aka root's children, top to bottom ordering)
//Then all nodes at depth 2, and so on till max depth reached
en = root.preorderEnumeration();
//Imagine your JTree is fully expanded (where each node = a row)
//Enumeration will list nodes from top to bottom (regardless of leaf or not)
en = root.postorderEnumeration(); //Equivalent to root.depthFirstEnumeration();
//Imagine a fully expanded copy of your JTree (where each node = a row)
//This will allow you to visualize what Enumeration List will look like
while(treecopy.hasNodes()) {
list 1st leaf sighted going from top to bottom, then remove that leaf }
//as the leafs are removed, branches then become leafs, and root is last enumerated.
Первоначально я не сказал, что я имел в виду, я имел в виду это как визуализацию, но я случайно сказал это буквально. Я изменил его сейчас, надеюсь, это более понятно, спасибо за отзывы. – neokyle
Что вы понимаете, анализируя его? Как правило, вы должны анализировать выражение для построения внутреннего представления (например, древовидной структуры, которую вы уже имеете). Вы просто хотите пересечь дерево? – Adamski
Извините за это. Да, я имел в виду пересечь его. – fixxxer