首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >创建层次下拉列表的算法

创建层次下拉列表的算法
EN

Stack Overflow用户
提问于 2017-03-16 03:32:32
回答 2查看 159关注 0票数 0

我正在创建一个动态的HTML部门,它有下拉内容作为一个层次结构的基础上从数据库收到的价值。我将根据我从数据库中收到的值给出一个示例。结果集

代码语言:javascript
复制
ID  Name  ParentID
7   A      2
8   B      7
9   C      7
10  D      7
11  E      2
12  F      2
14  G      7

为此,生成的Html应为

代码语言:javascript
复制
<ul>
   <li> A 
        <ul>
            <li>B</li>
            <li>C</li>
            <li>D</li>
            <li>G</li>
       </ul>

   </li>
   <li>E</li>
   <li>F</li>
</ul>

有没有人能提出算法来实现这样的结果。提前谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-16 06:04:27

我用Java写了一段代码,但我想你写C#代码不成问题。您可以测试我的代码here。其思想是将结果集映射到用next类表示的层次结构上。

Node类:

代码语言:javascript
复制
class Node {
    private String name;
    private List<Node> children;

    Node(String name) {
        this.name = name;
        children = new ArrayList<>();
    }

    void addChild(Node child) {
        children.add(child);
    }

    List<Node> getChildren() {
        return children;
    }

    public String toString() {
        return this.name;
    }
}

一些帮助器类只是为了干净的代码:

代码语言:javascript
复制
class Tag {
    private String open;
    private String close;

    Tag(String open, String close) {
        this.open = open;
        this.close = close;
    }

    String open() {
        return open;
    }

    String close() {
        return close;
    }
}

层次结构仿真(我还添加了额外的级别用于演示):

代码语言:javascript
复制
private static List<Node> createHierarchy() {
    List<Node> nodes = new ArrayList<>();
    Node nodeA = new Node("A");
    Node nodeB = new Node("B");
    Node nodeC = new Node("C");
    Node nodeD = new Node("D");
    Node nodeE = new Node("E");
    Node nodeF = new Node("F");
    Node nodeG = new Node("G");
    Node node1 = new Node("1");
    Node node2 = new Node("2");
    Node node3 = new Node("3");
    Node node4 = new Node("4");
    nodeA.addChild(nodeB);
    nodeA.addChild(nodeC);
    nodeD.addChild(node1);
    nodeD.addChild(node2);
    node2.addChild(node3);
    node2.addChild(node4);
    nodeA.addChild(nodeD);
    nodeA.addChild(nodeE);
    nodes.add(nodeA);
    nodes.add(nodeF);
    nodes.add(nodeG);
    return nodes;
}

和一个主要的逻辑。我使用递归来遍历我的数据结构:

代码语言:javascript
复制
public static void main(String[] args) {
    printHierarchy(createHierarchy(), new StringBuilder());
}

private static void printHierarchy(List<Node> nodes, StringBuilder stringBuilder) {
    stringBuilder.append(ul.open());
    for (Node node : nodes) {
        printNode(node, stringBuilder);
        printChildren(node.getChildren(), stringBuilder);
        stringBuilder.append(li.close());
    }
    stringBuilder.append(ul.close());
    System.out.print(stringBuilder.toString());
}

private static void printNode(Node node, StringBuilder stringBuilder) {
    stringBuilder.append(li.open()).append(node);
}

private static void printChildren(List<Node> children, StringBuilder stringBuilder) {
    if (children.size() == 0) {
        return;
    }
    stringBuilder.append(ul.open());
    for (Node child : children) {
        stringBuilder.append(li.open()).append(child);
        if (child.getChildren().size() > 0) {
            printChildren(child.getChildren(), stringBuilder);
        }
        stringBuilder.append(li.close());
    }
    stringBuilder.append(ul.close());
}

结果:

代码语言:javascript
复制
<ul>
  <li>A
    <ul>
      <li>B</li>
      <li>C</li>
      <li>D
        <ul>
          <li>1</li>
          <li>2
            <ul>
              <li>3</li>
              <li>4</li>
            </ul>
          </li>
        </ul>
      </li>
      <li>E</li>
    </ul>
  </li>
  <li>F</li>
  <li>G</li>
</ul>
票数 1
EN

Stack Overflow用户

发布于 2017-03-16 03:46:54

从ParentID = null开始。

获取ParentID与您的ParentID匹配的所有项,检查下一个子级是否有多个项;如果有,则将它们包装在-tag中。

然后遍历你得到的所有项目,追加项目并递归地处理它们的子级。

如果您没有获得更多与您的ParentID匹配的项目,则会到达端节点。

此外,不要忘记关闭您打开的-tags。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42819084

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档