我正在创建一个动态的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为此,生成的Html应为
<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>有没有人能提出算法来实现这样的结果。提前谢谢。
发布于 2017-03-16 06:04:27
我用Java写了一段代码,但我想你写C#代码不成问题。您可以测试我的代码here。其思想是将结果集映射到用next类表示的层次结构上。
Node类:
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());
}结果:
<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>发布于 2017-03-16 03:46:54
从ParentID = null开始。
获取ParentID与您的ParentID匹配的所有项,检查下一个子级是否有多个项;如果有,则将它们包装在-tag中。
然后遍历你得到的所有项目,追加项目并递归地处理它们的子级。
如果您没有获得更多与您的ParentID匹配的项目,则会到达端节点。
此外,不要忘记关闭您打开的-tags。
https://stackoverflow.com/questions/42819084
复制相似问题