我有一个java bean类:
class Node{
int id, parentId;
String value;
List<Node> childs;
}
如何在此层次结构中找到父节点,并在父节点的子列表中插入子节点。
节点之间的关系定义为:
如果node1.id == node2.parentid
,那么node2
将位于node1
的子列表中。
这可以是第N级层次结构。
答案 0 :(得分:1)
为了在该层次结构中查找节点,您必须实现遍历方法。我建议使用递归方法并使用广度优先或深度优先搜索模式。找到正确的节点后,插入孩子。
例如:
public Node search(Node root, int searchId) {
if (root.id == searchId) {
return root;
} else {
for (Node child : root.childs) {
Node node = search(child, searchId);
if (node != null) {
return node;
}
}
}
return null;
}
public void insert(Node node) {
Node parent = search(root, node.parentId);
if (node != null) {
parent.childs.add(node);
}
}
答案 1 :(得分:1)
尝试这样的事情
insertNode(Node nodeToInsert, Node anyNodeInHirarchy) {
Node parent = getParentNodeById(anyNodeInHirarchy.parentId);
if(parent.Id == nodeToInsert.parentId) {
parent.childs.add(nodeToInsert);
} else {
insertNode(nodeToInsert, parent)
}
}
return getParentNodeById(int nodeId) {
// Find node by id and return
return node;
}
答案 2 :(得分:0)
很容易:
childNode.setParentId(parentNode.getId());
parentNode.getChilds().add(childNode);
答案 3 :(得分:0)
快速做到这一点的方法是 Guid应该轻松指向对象,以便您可以轻松地指向第n个节点。
生成单个随机GUID 例如:说45892 根节点将指向该id。 child将指向Parent_ID +“ - ”+ Index_Number模式 如果考虑三个孩子将有45892-0,45892-1,45892-2 第一个节点的孩子变成了 - 45892-0-1,45892-0-2
因此,您可以直接使用ID直接旅行,无需搜索,搜索时间将被保存。
如果你不明白请评论。我将在编程中展示。
注意:ID长度会根据您的使用级别而增长。
如果数据已存在于db或某个持久性存储中,那么您可以选择jgitter代码。如果没有,你可以更喜欢这个。
class Node {
public String id;
public String parentId;
public List<Node> childs;
}
class Operation {
public Node getChildNodeByID(Node root,String parentId) {
String[] keys = parentId.split("-");
Node parentNode = root;
int index = 0;
for(String key : keys ) {
if(index == 0) {
if( !root.id.equals(key) ) {
throw new IllegalArgumentException("Root node does not match so parent node will not be found in this node");
}
}else {
int myIndex = Integer.parseInt(key);
if( parentNode.childs.getSize() > myIndex ) {
parentNode = parentNode.childs.get(myIndex);
}else {
throw new IllegalArgumentException("Parent Node does not exist");
}
}
index++;
}
return parentNode;
}
public insert(Node node,Node root) {
Node parentNode = getChildNodeByID(root,node.parentId);
node.id = node.parentId+"-"+parentNode.childs.getSize();
parentNode.childs.add(node);
}
}