通过id从java中的嵌套对象列表中查找对象

时间:2014-04-28 05:04:32

标签: java collections

我有一个java bean类:

class Node{

    int id, parentId;
    String value;
    List<Node> childs;

}

如何在此层次结构中找到父节点,并在父节点的子列表中插入子节点。 节点之间的关系定义为: 如果node1.id == node2.parentid,那么node2将位于node1的子列表中。

这可以是第N级层次结构。

4 个答案:

答案 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);  
              }
            }