我想用java从数据库中移动一棵树。
首先从数据库获取结果集:
String selectTree = "select id, id_parent, text from tree ";
ResultSet resultSet = statement.executeQuery(selectTree);
resultSet.last();
sizeOfSelect = resultSet.getRow();
resultSet.beforeFirst();
list = new ArrayList<Node>(sizeOfSelect);
while(resultSet.next()) {
list.add(new Node(resultSet.getInt(1),
resultSet.getInt(2),
resultSet.getString(3)));
}
现在我有一个节点数组:
class Node<T> {
private int id;
private int parent_id;
private String text;
Node(int _id, int _parentId, String _text) {
this.id = _id;
this.parent_id = _parentId;
this.text = _text;
}
//getters & setters here
如何在java中获得相同的树?
你能告诉我你的想法吗?
我在解决问题上取得了进展。
我在地图中旋转rawnode数组,因此:
for(RawNode rawNode : tmpList) {
tmpMap.put(rawNode.getId(), dependsId(rawNode.getId()));
}
其中方法dependsId()是:
private List<RawNode> dependsId(int id) {
List<RawNode> tmpDependList = new ArrayList<>();
for(RawNode rawNode : tmpList) {
if(rawNode.getParentId() == id) {
tmpDependList.add(rawNode);
}
}
return tmpList;
}
下一步我该怎么办?如何在具有父节点和子节点的节点数组中转换此映射?
最佳答案
现在,您的“原始”节点如下所示:
class RawNode {
private int id;
private int parent_id;
private String text;
[提示:我重新命名了类声明;并删除了
<T>
部分,这一部分没有任何意义,因为您在该类中没有泛型;至少从显示的内容中删除了]理想情况下,这意味着每个ID只有一个节点对象。换句话说,随着时间的推移,您创建了如下对象:
RawNode rootWithoutParent = new Node(0, -1, "root");
RawNode firstChildParent = new Node(1, 0, "root");
所有这些对象都在一个数组/列表中。现在,您可以将这些RawNodes转换为“真实”节点,并且该节点可以如下所示:
class Node {
private int id;
private Node parent;
private List<Node> children = new ArrayList<>();
private String text;
翻译可以在多次迭代中完成。
首先,为每个rawnode创建一个节点(稍后,我们将在两个映射中记住特定信息):
List<Node> nodes = new ArrayList<>();
Map<Node, RawNode> rawNodesByNode = new HashMap<>();
Map<Integer, Node> nodesById = new HashMap<>();
for(RawNode rawNode : tmpList) {
Node node = new Node();
node.setId(rawNode.getId());
node.setText(rawNode.getText());
rawNodesByNode.put(node, rawNode);
nodesById.put(rawNode.getId(), node);
}
少了什么?
首先,孩子和父母之间的“联系”。
for(Node node : nodes) {
RawNode raw = rawNodesByNode.get(node);
int parentId = raw.getParentId();
Node parent = nodesById.get(parentId);
node.setParent(parent);
}
第二个(“可选”)从家长到所有孩子的“链接”:
for(Node node : nodes) {
Node parent = node.getParent(); // should be != null by now
parent.addChild(node);
}
与
void addChild(Node node) {
children.add(node);
}
(请注意:当您执行Node.new()调用时,会直接创建子列表;但此时,它是空的除此之外:我没有将代码放入编译器中;它的意思是“伪代码”,让您继续;并对所需步骤给出一些见解还有一种潜在的“bug”情况,即需要进行特殊检查来处理诸如“根节点”这样没有父节点的情况;换句话说:不要只复制和粘贴我的代码:理解它应该做什么并从那里开始工作。
希望这能给你足够的想法让你走。请注意:所有这些都只是“工作”;不涉及“火箭科学”;所以最重要的是你现在参与并理解你将要做的事情。所以,不要急着再问一个问题;而是:开始工作。