2015-07-28 91 views
0

我有一個數據庫表的記錄有StructureGuidParentGuid。所以大多數父母有一個孩子。如何創建一個遞歸算法來在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; 
    } 

現在它卡在第一根節點的第一個子連續循環。

+0

爲什麼遞歸的節點?你沒有SQL的記錄集嗎?如果您已經知道哪個孩子屬於父母,那麼找到父母並追加孩子。 – fantaghirocco

+0

@fantaghirocco你看它就像一棵結構樹,所以一個元素的孩子有自己的孩子。我必須事先知道樹的長度,如果我不想再發生,也是更多不必要的代碼。 – surfer190

回答

0

我不久前使用Delphi做了類似的事情,而沒有使用遞歸方法。

  • 獲得父母和孩子與由parent_id排序的單個查詢:這允許具有第一根節點(其具有nullparent_id元素)
  • 擷取recorset時:
    • 將父母(具有孩子的元素)附加到樹上,並將附加的節點放入map,如<element_id,node>
    • 當取孩子(h AVE父),搜索在map其父節點(parent_id),你會發現那裏的孩子必須連接到