从Java方法的递归调用生成OL LI树结构

时间:2011-06-03 20:49:24

标签: java recursion

我有对象列表类型Node( items )。 Node类中有子节点( childItems )。我想在ol li html标记中打印这个结构。

以递归方式准备。但是我的逻辑中存在一些问题。看看我的代码。

项目的大小将为2.根据给定的示例标记。意味着存在2个顶级父母。然后他们还有其他孩子作为他们的名单。

StringBuffer html = new StringBuffer();

 void printValues(ArrayList items){ 
for (Object o : items){
    html.append("<ol>");
    html.append("<li>");
    Node node = (Node)o;
    html.append(node.getName);

    if (node.getChildItems()!= null){
        printValues(node.getChildItems());
    }else{
        html.append("</li>");
    }
    html.append("</ol>");
}   
 }
// ...........
 System.out.println(html.toString(););

//...
  public class Node{
String Name;
ArrayList childItems = new ArrayList(); // of type Node
/* getter setters are proper */
}

以下标记就是一个例子。它可以在N级。

<ol>
<li>
    Manager
    <ol>
        <li>
            Associate Manager
            <ol>
                <li>
                    A.M. Configuration 1
                </li>
                <li>
                    A.M. Configuration 2
                </li>
                <li>
                    Staff Memmber
                    <ol>
                        <li>
                            Staff Memmber Configuration
                        </li>
                        <!-- can goes on -->
                        <li>...</li>
                    </ol>
                </li>
            </ol>
        </li>
    </ol>
</li>
<li>
    Client Package
    <ol>
        <li>
            Gold
            <ol>
                <li>
                    Feature 1
                </li>
                <li>
                    Feature 2
                </li>
            </ol>
        </li>
    </ol>
</li>

2 个答案:

答案 0 :(得分:1)

这一部分应该得到解决:

...
html.append("<li>");    
Node node = (Node)o;    
html.append(node.getName);    
if (node.getChildItems()!= null){        
  printValues(node.getChildItems());    
}else{
  html.append("</li>");    
}
...

当我们将其减少到

时,你会明白我的意思
...
html.append("<li>");    
...
if (node.getChildItems()!= null){        
  ...    
}else{
  html.append("</li>");    
}
...

答案 1 :(得分:1)

这是一个例子(我对相互调用的函数的评论):

public class LiOl {
  static StringBuilder sb = new StringBuilder();

  static void printList(List<Node> l) {
    if (l == null || l.size() == 0) {
      return;
    }
    sb.append("<ol>");
    for (Node n : l) {
      printNode(n);
    }
    sb.append("</ol>");
  }

  static void printNode(Node n) {
    sb.append("<li>").append(n.name).append("</li>");

    sb.append("<li>");
    printList(n.children);
    sb.append("</li>");
  }

  public static void main(String[] args) {
    List<Node> l = null;
    printList(l);

    sb.toString();
  }
}

class Node {
  String name;
  List<Node> children;
}