我正在尝试从平面数据创建层次结构。我有以下Node
定义:
public class Node {
public String name;
public List<Node> children = new ArrayList<>();
}
鉴于此数据:[Person,Manager,Hourly,New]
,树应该是这样的:
Person
|--Manager
|--Hourly
|--New
我尝试了以下内容:
public void run()
{
List<List<String>> objects = new ArrayList<>();
String[] str = {"Person","Manager","Hourly","New"};
objects.add(Arrays.asList(str)) ;
String[] str2 = {"Person","Manager","Salary"};
objects.add(Arrays.asList(str2)) ;
String[] str3 = {"Person","Manager","Salary", "New"};
objects.add(Arrays.asList(str3)) ;
// Create a Node with the sequence
myNode = new Node();
createNode(objects.get(0), 0, myNode, myNode);
LOG.debug(myNode.name);
}
我的createNode
方法是:
public Node createNode(List<String> seq, Integer start, Node parentNode, Node childNode)
{
// do something and return a Node?
}
但从概念上讲,如果Java是按值返回,我不明白如何维护结构。我应该向createNode
添加什么内容,以便我可以将管理器 - &gt;每小时 - &gt;新层次结构作为子项添加到Person
答案 0 :(得分:0)
您的方法不需要Node
返回类型和 Node
参数。
以下是一种方法:
//in run()
myNode = new Node();
myNode.name = "Root";
createNode(objects.get(0), 0, myNode, myNode);
public void createNode(List<String> seq, Integer start, Node parentNode)
{
Node childNode = new Node();
childNode.name = seq[start];
parentNode.children.Add(childNode);
createNode(seq, start+1, childNode);
}
您不需要从createNode()
返回任何内容 - 因为您有parentNode
作为变量,您可以向其children
成员添加内容。对createNode()
的调用将递归地添加子节点,跟随字符串数组到达结尾。
另一种方法是:
public Node createNode(List<String> seq, Integer start)
{
if (start >= seq.Length) {
return null;
}
Node node = new Node();
node.name = seq[start];
node.children.Add(createNode(seq, start+1);
return node;
}
在这种情况下,您根本不需要传递node
个引用;调用createNode()
将生成一个新的节点对象,递归填充其children
树,并返回新生成的节点结构。
答案 1 :(得分:0)
我可以看到你对节点的定义有点类似于图中的邻接列表。 在目标节点中,在与目标节点关联的列表中添加关联节点。对于属于所有节点的每个节点都是如此。
对于createNode方法中属于objects数组(数组参数)的每个对象,您需要创建Node对象。 只需传递一个String数组和taeget节点。迭代列表并创建一个节点。在列表中添加节点。
为避免重复,请在创建节点时将其添加到地图中。映射的键应该是String,值应该是Node对象。在创建节点对象之前,只需尝试从地图中获取对象,仅在地图中找不到对象时才创建对象(在这种情况下创建并将其添加到地图中)。如果在地图上找到了对象,我们就不会重新创建它。