我想用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”情况,即需要进行特殊检查来处理诸如“根节点”这样没有父节点的情况;换句话说:不要只复制和粘贴我的代码:理解它应该做什么并从那里开始工作。
希望这能给你足够的想法让你走。请注意:所有这些都只是“工作”;不涉及“火箭科学”;所以最重要的是你现在参与并理解你将要做的事情。所以,不要急着再问一个问题;而是:开始工作。

09-26 05:42