使用Java遍历最深处
我有一个如下的数据结构:
Task(id,name,subTasks[Task])
但问题是subTasks可以包含具有另一个子任务的任务。 这可以像这样非常深:
Task1 Contains SubTask1
SubTask1包含它的子任务
你可以理解这可以运行得非常深。
我可以从数据库表中检索这些数据。 但是我如何将它存储在java中的数据结构中。 在不知道深度的情况下使用for循环是无用的,而不是一种优雅的方式。 什么是最好的数据结构和数据遍历方式?
使用Guava TreeTraverser:
Task root = ... /* * For example, you have the following tree: * * h * / | \ * / e \ * dg * /|\ | * / | \ f * abc */ TreeTraverser traverser = new TreeTraverser () { @Override public Iterable children(Task root) { return root.subTasks; } };
然后,您可以通过以下几种方式使用for
循环遍历树:
// Iterate in breadth-first order (hdegabcf) for (Task task : traverser.breadthFirstTraversal(root)) { ... }
要么
// Iterate in preorder (hdabcegf) for (Task task : traverser.preOrderTraversal(root)) { ... }
要么
// Iterate in postorder (abcdefgh) for (Task task : traverser.postOrderTraversal(root)) { ... }
数据结构:由对象引用形成的隐式树。
遍历:递归或队列。
但是,您必须单独考虑每个用例。 有些人会要求深度优先遍历,有些则需要广度优先遍历。 如果您需要大量的图形操作,请考虑使用一些图形库来构建树。
- 线程“AWT-EventQueue-0”中的exceptionjava.lang.ClassCastException:javax.swing.JTable
- 抓住一个“双”热键
- 如何将字符串转换为字节和后退
- JBOSS 7.1.0错误 – 无法找到类org.jboss.resteasy.core.AsynchronousDispatcher的公共构造函数
- 是否可以在JBoss定时服务中使用Seam?
- 项目创意课程
- 什么是给jvm的线程堆栈大小选项(-Xss)? 为什么Windows PC中至少有68k的限制?
- 如何在unit testing中模拟InitialContext构造函数
- 使用属性值的RequestMapping进行Spring Boot REST控制器测试