我需要从Access数据库中读入成员列表。每个成员都由另一名成员赞助。每条记录都包含其赞助商的ID和他们自己的ID。我现在必须能够有效地阅读会员名单并打印出来,以显示由谁赞助的人。
我觉得最有效的方法是构建一个树然后进行顺序遍历。
我的输出应该是这样的:
Mary Jones
Kim Smith
Rena Brown
Joan Brown
Patsy Brown
Howard Sharp
Ken Johnson
Peter Pan
Wendy
Hook
Davey Crocket
…
订单将按身份证号码。我发现的一切都是二元树,只有左右儿子。如你所见,这对我不起作用。
首选解决方案是Java,但我会非常感激。
邦尼
答案 0 :(得分:0)
这就是我想出的。它定义了一个名为ListSponsoredMembers
的函数,并以递归方式调用它来构建列表:
import java.sql.*;
public class ListSponsorship {
static Connection conn;
public static void main(String[] args) {
try {
conn = DriverManager.getConnection(
"jdbc:ucanaccess://C:/Users/Public/Database1.accdb;");
PreparedStatement ps1 = conn.prepareStatement(
"SELECT memberID, memberName FROM Members " +
"WHERE sponsorID IS NULL ORDER BY memberID");
ResultSet rs = ps1.executeQuery();
while (rs.next()) {
ListSponsoredMembers(rs.getInt("memberID"), rs.getString("memberName"), 0);
}
ps1.close();
conn.close();
} catch(Exception e) {
e.printStackTrace();
}
}
private static void ListSponsoredMembers(Integer memberID, String memberName, Integer recursionLevel) {
for (Integer i = 0; i < recursionLevel; i++) {
System.out.print(" ");
}
System.out.println(memberName);
try {
PreparedStatement ps2 = conn.prepareStatement(
"SELECT memberID, memberName FROM Members " +
"WHERE sponsorID=? ORDER BY memberID");
ps2.setInt(1, memberID);
ResultSet rs = ps2.executeQuery();
Integer newRecursionLevel = ++recursionLevel;
while (rs.next()) {
ListSponsoredMembers(rs.getInt("memberID"), rs.getString("memberName"), newRecursionLevel);
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
对于看起来像这样的[Members]表...
memberID memberName sponsorID
-------- ------------- ---------
1 Mary Jones
2 Kim Smith 1
3 Rena Brown 1
4 Joan Brown 3
5 Patsy Brown 4
6 Howard Sharp 1
7 Ken Johnson 1
8 Peter Pan
9 Wendy 8
10 Hook 8
11 Davey Crocket
...它产生以下输出:
Mary Jones
Kim Smith
Rena Brown
Joan Brown
Patsy Brown
Howard Sharp
Ken Johnson
Peter Pan
Wendy
Hook
Davey Crocket