0
我有一個數據庫表的記錄有StructureGuid
和ParentGuid
。所以大多數父母有一個孩子。如何創建一個遞歸算法來在java中創建一棵樹?
我想創建一個遞歸算法來構建樹。
類樹是Header.java
:
public class Header implements MultiLevelExpIndListAdapter.ExpIndData {
private List<Header> mChildren;
private boolean mIsGroup;
private int mGroupSize;
public String header;
public String structureGuid;
public Header(String header, String guid){
this.header = header;
this.structureGuid = guid;
mChildren = new ArrayList<Header>();
setIndentation(0);
}
@Override public List<? extends MultiLevelExpIndListAdapter.ExpIndData> getChildren() {
return mChildren;
}
@Override public boolean isGroup() {
return mIsGroup;
}
@Override public void setIsGroup(boolean b) {
mIsGroup = b;
}
@Override public void setGroupSize(int i) {
mGroupSize = i;
}
public int getGroupSize() {
return mGroupSize;
}
public void addChild(Header child){
mChildren.add(child);
child.setIndentation(getIndentation() + 1);
}
}
我使用SQL框架來獲取根節點,然後我通過他們循環。停止情況是節點(Header
)沒有任何子節點時。
代碼:
//Get the root nodes
public static List<Header> getHeaders(){
List<Structure> list = new Select().from(Structure.class)
.where(Condition.column(Structure$Table.PARENTGUID).eq(""))
.and(Condition.column(Structure$Table.STATUS).eq(true))
.and(Condition.column(Structure$Table.REQUIRED).eq(true))
.orderBy("Sequence ASC").queryList();
ArrayList<Header> headers = new ArrayList<>();
for (Structure struct: list){
headers.add(new Header(struct.getDescription(), struct.StructureGUID));
}
return addChildren(list, headers);
}
//recursively return child nodes
public static List<Header> addChildren(List<Structure> structures, List<Header> headers){
List<Header> newHeader = new ArrayList<>();
//recurring algorithm - while there are no kids get headers
if(headers.size() > 0) {
for (int i = 0; i < headers.size(); i++) {
//get children of that header - if none return empty arraylist
//else loop through and addChildren
List<Structure> list = new Select().from(Structure.class)
.where(Condition.column(Structure$Table.PARENTGUID).eq(headers.get(i).structureGuid))
.and(Condition.column(Structure$Table.STATUS).eq(true))
.and(Condition.column(Structure$Table.REQUIRED).eq(true))
.orderBy("Sequence ASC").queryList();
List <Header> temp = new ArrayList<Header>();
Log.e("TAG", "size of array: " + list.size());
if (list.size() != 0) {
for (Structure struct : list) {
headers.get(i).addChild(new Header(struct.getDescription(), struct.StructureGUID));
temp.add(headers.get(i));
}
}
newHeader = addChildren(list, temp);
}
}
return newHeader;
}
現在它卡在第一根節點的第一個子連續循環。
爲什麼遞歸的節點?你沒有SQL的記錄集嗎?如果您已經知道哪個孩子屬於父母,那麼找到父母並追加孩子。 – fantaghirocco
@fantaghirocco你看它就像一棵結構樹,所以一個元素的孩子有自己的孩子。我必須事先知道樹的長度,如果我不想再發生,也是更多不必要的代碼。 – surfer190