【发布时间】:2018-07-13 16:02:45
【问题描述】:
我有一个具有父子关系的数据库表,任何父级都可以有任意数量的子级,但根级别只有 1 个父级。数据如下:
TagID ParentTagID TagName
-------------------------------
1 null a
2 1 b
3 1 c
4 1 d
5 2 e
6 4 f
7 2 g
我想以树格式获取 java 中的记录。虽然我可以使用下面的 SQL 在 SQL 级别本身实现这一点,但我想从数据库中提取数据并在 java 级别执行处理,以便 java 和 SQL 之间的连接可以最短持续时间,以避免任何延迟数据库端。
with cte as
(
select * from TagValue
where ParentTagID is null
union all
select s.* from TagValue s
join cte c on s.ParentTagID = c.TagID
)
select * from cte
在其他有用链接的帮助下使用 Java,我创建了一个树,如下所示:
public class MyTreeNode<T> {
private T data = null;
private List<MyTreeNode<T>> children = new ArrayList<MyTreeNode<T>>();
private MyTreeNode<T> parent = null;
public MyTreeNode(T data) {
this.data = data;
}
public void addChild(MyTreeNode<T> child) {
child.setParent(this);
this.children.add(child);
}
public void addChild(T data) {
MyTreeNode<T> newChild = new MyTreeNode<T>(data);
newChild.setParent(this);
children.add(newChild);
}
public void addChildren(List<MyTreeNode<T>> children) {
for (MyTreeNode<T> t : children) {
t.setParent(this);
}
this.children.addAll(children);
}
public List<MyTreeNode<T>> getChildren() {
return children;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
private void setParent(MyTreeNode<T> parent) {
this.parent = parent;
}
public MyTreeNode<T> getParent() {
return parent;
}
}
在这棵树中插入对象时,我可以使用以下代码:
MyTreeNode<Integer> root = new MyTreeNode<Integer>(1);
MyTreeNode<Integer> child1 = new MyTreeNode<Integer>(2);
child1.addChild(3);
child1.addChild(4);
MyTreeNode<Integer> child2 = new MyTreeNode<Integer>(5);
child2.addChild(6);
root.addChild(child1);
root.addChild(child2);
root.addChild(7);
root.addChildren(Arrays.asList(new MyTreeNode<Integer>(8),
new MyTreeNode<Integer>(9), new MyTreeNode<Integer>(10)));
但这是一个静态代码,而标签的数量可以是动态的。我需要一个递归解决方案来根据 ParentTag 值找到一个节点,然后将新标签插入为其子标签。有递归解决方案吗?如果 Java 1.8 中有任何其他开箱即用的数据结构来执行此操作,那也会很有用。
【问题讨论】:
-
我可能会在数据库中处理这个问题。是什么让您认为在 Java 中这样做会很高效?
-
静态
addChild(MyTreeNode<T> child, MyTreeNode<T> parent)不能满足您的需求吗? -
@TimBiegeleisen...你是对的,但我们计划将所有数据处理从数据库迁移到 java 端
-
@c0der...没错,但我应该如何遍历现有树以找到基于 ParentTag 的节点以将新节点添加为其子节点?我是否应该创建一个 List
> 并在每次需要插入新对象以在那里找到父节点时一次又一次地遍历列表?
标签: java algorithm recursion data-structures tree