Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
数据库树到java_Java_Algorithm_Tree - Fatal编程技术网

数据库树到java

数据库树到java,java,algorithm,tree,Java,Algorithm,Tree,我想用java从数据库中移动一棵树 首先,我从数据库中获取ResultSet: String selectTree = "select id, id_parent, text from tree "; ResultSet resultSet = statement.executeQuery(selectTree); resultSet.last(); sizeOfSelect = resultSet.getRow(); resultSet.beforeFirst(); lis

我想用java从数据库中移动一棵树

首先,我从数据库中获取ResultSet:

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)));
}
其中,dependsId()方法为:

private List dependsId(int-id){
List tmpDependList=newarraylist();
for(RawNode RawNode:tmpList){
if(rawNode.getParentId()==id){
tmpDependList.add(rawNode);
}
}
返回tmpList;
}
接下来我该怎么办?如何在包含父节点和子节点的节点数组中转换此映射?

现在,您的“原始”节点如下所示:

class RawNode {
  private int id; 
  private int parent_id;
  private String text;
[提示:我重命名了该类声明;并删除了
部分,该部分没有任何意义,因为该类中没有泛型;至少从您显示的内容中是这样]

理想情况下,这意味着每个ID都有一个节点对象;随着时间的推移,您创建了如下对象:

RawNode rootWithoutParent = new Node(0, -1, "root");
RawNode firstChildParent = new Node(1, 0, "root");
所有这些对象都在一个数组/列表中。现在,您可以将这些原始节点转换为“真实”节点,该节点可以如下所示:

class Node {
  private int id; 
  private Node parent;
  private List<Node> children = new ArrayList<>();
  private String text;
第二(“可选”)从父母到所有孩子的“链接”:

for(Node node : nodes) {
  Node parent = node.getParent(); // should be != null by now
  parent.addChild(node);
}
与:

(请注意:子列表是在执行Node.new()调用时直接创建的;但在这一点上,它是空的。除此之外:我没有将代码放入编译器中;它的意思是“伪代码”,以帮助您继续;并对所需步骤提供一些见解。此外,还存在某种潜在的“bug”-需要进行特殊检查以处理诸如“根节点”这样没有父节点的情况的情况;换句话说:不要只是复制和粘贴我的代码:了解它应该做什么并从那里开始工作)


希望这能给你足够的想法让你走。请注意:所有这些都只是“工作”;不涉及"火箭科学",;因此,最重要的部分是你现在参与并理解你将要做的事情。所以,不要再提另一个问题;相反:开始工作

好吧,如果您想要树,您的节点肯定缺少到其他节点的链接(至少对于父节点),我建议将节点中的
父节点id
替换为
节点父节点
,并根据数据库中的父节点id进行设置,例如首先将它们全部添加到映射,由
Map someMap
映射,其中integer是id,然后迭代trhough each并执行以下操作:

list.add(new Node(resultSet.getInt(1), 
            someMap.get(resultSet.getInt(2)), 
            resultSet.getString(3)));
哦,别忘了检查父id是否为空

我并不经常使用结果集,但我认为最好将它们从那里移到一些临时列表中


真的很抱歉,我没有时间把所有的东西都写下来,但我希望你已经了解我的想法了

你能读一下你的评论吗?提示:在一个问题中输入的代码永远不会超过10个字符。我已经告诉过你:这不是一个家教服务,如果我们带你完成解决方案的所有必要步骤。我明白了。。。你可能想在明天早些时候给我留言,提醒我看看你的变化。。。但正如所说:仔细看看没有我你能走多远;然后看看到底是什么问题阻碍了你的进步;有点扔掉了我刚开始说的一些东西。现在应该是“更完整”了。我把+1作为我最后的评论。。。你的问题现在已经“回答够了”?!如果是的话,和你一起工作很愉快;但正如所说:不要期望每次都会发生这种情况。最后,学习编程主要是关于自己做很多事情。依靠别人的经验似乎更方便、更有效;但关键是:你想撞到墙。。。不断地,直到你想出如何解决这个难题。话虽如此,祝你在未来的工作中好运。
class Node {
  private int id; 
  private Node parent;
  private List<Node> children = new ArrayList<>();
  private String text;
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);
}
list.add(new Node(resultSet.getInt(1), 
            someMap.get(resultSet.getInt(2)), 
            resultSet.getString(3)));