从字符串路径列表构造树结构

我在列表中有一组字符串路径,如[“x1 / x2 / x3”,“x1 / x2 / x4”,“x1 / x5”]。 我需要从这个列表构建一个树状结构,可以迭代得到一个漂亮的打印树。 喜欢这个

x1 / \ x5 x2 / \ x3 x4 

有什么想法/建议吗? 我相信通过处理字符串列表可以首先攻击问题EDIT:选择的正确答案是优雅的实现,其他建议也很好。

遵循可访问树的天真实现的实现:

 class Tree implements Visitable { // NB: LinkedHashSet preserves insertion order private final Set children = new LinkedHashSet(); private final T data; Tree(T data) { this.data = data; } void accept(Visitor visitor) { visitor.visitData(this, data); for (Tree child : children) { Visitor childVisitor = visitor.visitTree(child); child.accept(childVisitor); } } Tree child(T data) { for (Tree child: children ) { if (child.data.equals(data)) { return child; } } return child(new Tree(data)); } Tree child(Tree child) { children.add(child); return child; } } 

访客模式的接口:

 interface Visitor { Visitor visitTree(Tree tree); void visitData(Tree parent, T data); } interface Visitable { void accept(Visitor visitor); } 

访客模式的示例实现:

 class PrintIndentedVisitor implements Visitor { private final int indent; PrintIndentedVisitor(int indent) { this.indent = indent; } Visitor visitTree(Tree tree) { return new IndentVisitor(indent + 2); } void visitData(Tree parent, String data) { for (int i = 0; i < indent; i++) { // TODO: naive implementation System.out.print(" "); } System.out.println(data); } } 

最后(!!!)一个简单的测试用例:

  Tree forest = new Tree("forest"); Tree current = forest; for (String tree : Arrays.asList("x1/x2/x3", "x1/x2/x4", "x1/x5")) { Tree root = current; for (String data : tree.split("/")) { current = current.child(data); } current = root; } forest.accept(new PrintIndentedVisitor(0)); 

输出:

森林
   X1
     X2
       X3
       X4
     X5

只需通过分隔符拆分每个路径,然后逐个将它们添加到树结构中。
即如果'x1'不存在则创建此节点,如果确实存在则转到它并检查是否存在子节点'x2'等等…

我一次把树打成一根绳子。

制作一个空树(有一个根节点 – 我假设可能有一个像“x7 / x8 / x9”这样的路径)。

取第一个字符串,将x1添加到根节点,然后将x2添加到x1,然后将x3添加到x2。

取第二个字符串,看到x1和x2已经存在,将x4添加到x2。

为您拥有的每条路径都这样做。

创建一个对象节点,其中包含父节点(Node)和子节点列表(Node)。

首先使用“,”拆分字符串。 对于每个拆分的字符串,您使用“/”拆分字符串。 在根列表中搜索第一个节点标识符(例如x1)。 如果可以找到它,请使用该节点查找下一个节点标识符(例如x2)。

如果找不到节点,请将节点添加到您能够在现有列表中找到的最后一个节点。

创建列表结构后,可以将列表打印到屏幕上。 我会让它递归。

没有测试,只是一个动画

 public void print(List nodes, int deep) { if (nodes == null || nodes.isEmpty()) { return; } StringBuffer buffer = new StringBuffer(); for (int i = 0; i < deep; i++) { buffer.append("---"); } for (Iterator iterator = nodes.iterator(); iterator.hasNext();) { Node node = (Node)iterator.next(); System.out.println(buffer.toString() + " " + node.getIdentifier()); print(node.getChildren(), deep + 1); } } 

为数组中的每个字符串创建树。 只需拆分“/”路径,检查树中是否存在节点,如果存在,则继续…否则创建一个新节点并在父节点的子节点中添加此节点。

迭代使用递归。

以下是树节点的模型。

 Class Node{ string name; List childrens; Node(string name){ this.name = name; this.childrens = new List(); } }