算法创建层次结构下拉列表

时间:2017-03-15 19:32:32

标签: c# html algorithm

我正在创建一个动态HTML分区,它根据从数据库接收的值将内容下拉为层次结构。 我将根据我从数据库收到的值给出一个示例。 结果集

ratings_dataframe['title'] = \
    ratings_dataframe['movie_id'].map(movies.set_index('movie_id')['title'])

对于这个生成的Html应该是

ID  Name  ParentID
7   A      2
8   B      7
9   C      7
10  D      7
11  E      2
12  F      2
14  G      7

有人可以建议算法来实现这种结果。提前谢谢。

2 个答案:

答案 0 :(得分:1)

我用Java编写了一个代码,但我认为编写C#代码不会成为一个问题。您可以测试我的代码here。我们的想法是将结果集映射到用下一个类表示的层次结构。

节点类:

<?php
$url = "http://store.steampowered.com/app/312660/";
// $file = __DIR__ . DIRECTORY_SEPARATOR . "cookie.txt";
// $postData = array(
// 'ageDay' => '31',
// 'ageMonth' => 'July',
// 'ageYear' => '1993'
// );
$ch = curl_init();

curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_POST,true);
curl_setopt($ch,CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13");
curl_setopt($ch,CURLOPT_POSTFIELDS,$postData);
// curl_setopt($ch,CURLOPT_COOKIESESSION, true);
// curl_setopt($ch,CURLOPT_COOKIEJAR,$file); 
// curl_setopt($ch,CURLOPT_COOKIEFILE,$file);
$strCookie = 'mature_content=' . 1 . '; path=/';
curl_setopt( $ch, CURLOPT_COOKIE, $strCookie );

curl_setopt($ch,CURLOPT_FOLLOWLOCATION,true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$data = curl_exec($ch);

curl_close($ch);
echo $data;
?>

一些助手类只是为了清洁代码:

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;
    }
}

层次结构模拟(我还为演示添加了其他级别):

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;
    }
}

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

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;
}

结果:

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());
}

答案 1 :(得分:0)

以ParentID = null开头。

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

然后遍历所有项目,追加项目并递归处理其子级别。

如果您不再获得与您的ParentID匹配的项目,则会到达终端节点。

另外,不要忘记关闭打开的标签。