我有一個表在我的數據庫是這樣的:Contruct樹從表
等等...
正如你可以看到有幾根父母(其中有那些沒有parent_id),每個類別都有n個孩子。
我想用這個類將其轉換爲一個樹形結構中的Java:
private int id;
private String name;
private int parent;
private List<Category> children;
我用這個查詢得到的數據,我認爲這可能是改善:
SELECT c.*, ca.name, NVL(ca.parent_id, -1) AS parent_id FROM
(
SELECT id, name, parent_id FROM categories
) ca,
(
SELECT LISTAGG(id || ':' || name || ':' || DECODE(parent_id, NULL,
DECODE(id, NULL, NULL, -1), parent_id), ';')
WITHIN GROUP (ORDER BY id) AS children, parent_id AS id
FROM categories
GROUP BY parent_id HAVING parent_id IS NOT NULL
) c
WHERE c.id = ca.id
每次都遇到類別(id,name和parent_id)以及一個包含子元素的字符串。
然後i循環扔每結果集
List<Category> categories = new ArrayList<Category>();
while (rs.next()) {
Category c = new Category();
c = JdbcToModel.convertToCategory(rs); //
if (c.getParent() == -1) { // parent_id is null in database
categories.add(c);
else {
categories = JdbcToModel.addCategoryToTree(categories, c);
}
}
方法convertToCategory:
公共靜態類別convertToCategory(結果集RS){
Category toRet = new Category();
List<Category> children = new ArrayList<Category>();
try {
children = parseCategoriesFromReview(rs.getString("children"));
toRet.setId(rs.getInt("id"));
toRet.setName(rs.getString("name"));
toRet.setParent(rs.getInt("parent_id"));
toRet.setChildren(children);
} catch (Exception e) {
e.printStackTrace();
}
return toRet;
}
的方法parseCategoriesFromReview當我孩子的解析的字符串:
public static List<Category> parseCategoriesFromReview(String categoriesString) {
List<Category> toRet = new ArrayList<Category>();
try {
if (!categoriesString.equals("::")) {
String [] categs = categoriesString.split(";");
for (String categ : categs) {
String [] category = categ.split(":");
Category c = new Category(Integer.parseInt(category[0]), category[1], Integer.parseInt(category[2]), new ArrayList<Category>());
toRet.add(c);
}
}
} catch (Exception e) {
e.printStackTrace();
}
return toRet;
}
和遞歸方法addCategoryToTree:
public static List<Category> addCategoryToTree(List<Category> categories, Category c) {
try {
for (Category ct : categories) {
if (ct.getId() == c.getParent()) {
ct.getChildren().add(c);
break;
} else {
return addCategoryToTree(ct.getChildren(), c);
}
}
} catch (Exception e) {
e.printStackTrace();
}
return categories;
}
我認爲最大的問題是這種方法。我從未寫過一遞歸方法,裏面有一個循環,我不知道它是否正確。關鍵是我得到了一個樹結構,但只有幾個類別。最後一棵樹沒有那麼多。
也許我做複雜的事情,但我不知道如何做到這一點的另一種方式..
任何人的幫助?
問候!
它就像一個魅力!那是我想要的。非常感謝MT0!「 – Light1988