请一点建议。
我正在尝试使用以下数据行创建一个树:
TOP Level1 NotLeaf
Level1 Data1 leaf
TOP Level11 NotLeaf
Level11 Level2 NotLeaf
Level11 Data4 leaf
Level2 Data2 leaf
Level2 Data3 leaf
最后一列显示节点是否为叶子。因此,树看起来像:
Top
|
|- Level1, Level11
| |
| |
Data1 Level2, Data4
|
|
Data2, Data3
我将数据的每一行存储在bean中,然后将bean放入列表中。
public class Data {
private String parent;
private String name;
private int isLeaf;
public Data(String parent, String name, int isLeaf){
this.parent = parent;
this.name = name;
this.isLeaf= isLeaf;
//add to the list
}
//Getters
public List<Data> getDataList(){
return dataList;
}
}
现在对于树,我写了一个Node类,如下所示:
public class Node {
private final String nodeName;
private final List<Node> children;
public Node(String nodeName) {
this.nodeName = nodeName;
this.children = new ArrayList<Node>(10);
}
public String getNodeName() {
return nodeName;
}
public List<Node> getChildren() {
return Collections.unmodifiableList(children);
}
public void addChild(Node child) {
children.add(child);
}
}
但我似乎无法弄清楚如何将数据插入到Node中并获得如上面树中所示的关系。
也许缺乏睡眠隐藏着显而易见的,但任何建议都是最有帮助的。
由于
答案 0 :(得分:2)
我自己缺乏睡眠,所以我不打算编码,但大致 -
您不需要列来说明某些内容是否为叶节点。如果它没有孩子,那就是叶子,否则就不是了。
创建标记为“ROOT”的起始节点。
您的节点类很好。创建HashMap<String,Node>
。正如你所写的那样,每一行都包含一个父母与孩子的关系。你遍历你的线,在每一行,你这样做
如果地图已包含名为parent的节点,请获取它。否则创建它并添加到地图。对于孩子也一样。将子节点添加到父节点。创建节点时,如果该节点列在PARENT列中,则将其添加到ROOT节点。如果它列在子列中,则从根节点中删除它。
在解析完所有行之后,根的唯一子节点将是出现在PARENT列而不是CHILD列中的节点。 CHILD列中出现的任何内容都不是PARENT列,而是叶节点。除非子列表为空,否则父列中出现的任何内容都不会是叶子。
另外,我会避免使用标签“TOP”和“LEVEL1”来表示树中的固定位置,我们使用标签PARENT和CHILD。这样,您就可以获得可以存在于树中任何仲裁点的关系列表。
答案 1 :(得分:0)
我不会将数据与节点分开。相反,让Node成为复合并维护父信息。如果isLeaf
为空,则children
的测试可能会返回true。 “顶部”节点将具有空父级。