2014-01-12 106 views
-3

我從數據庫中提取記錄,其中每個記錄都有父列和子列,並且我將這些記錄作爲數組列表檢索。現在我想創建基於父子關係的遞歸數組列表。從記錄中創建java遞歸數組列表從數據庫中檢索

假設我檢索下面列表從數據庫

Id ParentId Child Id 
1  0  1 
2  0  2 
3  1  3 
4  1  4 
5  2  5 
6  2  6 
7  3  7 
8  3  8 
9  4  9 
10  4  10 
11  5  11 
12  5  12

所以第一根節點0有一個子節點作爲1,其具有如3,4公子節點。 3有7和8作爲子節點,4有9和10作爲子節點,依此類推......

第二個根節點0有一個子節點2,它有5個和6個子節點。 5有11和12作爲子節點等等...

我的節點類將是下面我將轉換成JSON數組而顯示爲樹UI

public class Node { 
    private int parentId; 
    private int childId ; 
    private List<Node> children = new ArrayList<Node>(); 

    public int getParentId() { 
     return parentId; 
    } 
    public void setParentId(int parentId) { 
     this.parentId = parentId; 
    } 
    public int getChildId() { 
     return childId; 
    } 
    public void setChildId(int childId) { 
     this.childId = childId; 
    } 
    public List<Node> getChildren() { 
     return children; 
    } 
    public void setChildren(List<Node> children) { 
     this.children = children; 
    } 
} 

我想創建列表像下面這樣的樹節點 可以有任意數量的根節點和子節點。

所以第一個根節點0有一個子節點爲1,它有3,4個子節點。 3有7和8作爲子節點,4有9和10作爲子節點,依此類推......

第二個根節點0有一個子節點2,它有5個和6個子節點。 5有11和12作爲子節點,等等......

+6

好的,你需要什麼幫助? – ChopChop

+0

我想從數據庫檢索記錄中創建遞歸樹節點列表。像父母0然後他們的孩子,然後他們的孩子等等。第二父母0然後他們的孩子,然後他們的孩子等等。 – user3188184

+2

我們得到那部分,但這是一個具體問題的地方,不拋出一個想法和讓我們爲你做。 – csmckelvey

回答

1
Take reference from the below code : 

private static void createRecursiveList(ArrayList<MenuView> menuList) 
    { 
     MenuView mainMenuView = null; 
     ArrayList<MenuView> mainMenuList = new ArrayList<MenuView>(); 

     int index = 0; 

     for(MenuView menuView : menuList) 
     { 
      if(menuView.getParentId() == 0) 
      { 
       ArrayList<MenuView> childMenuList = new ArrayList<MenuView>(); 
       findChildIndex(index, menuList, childMenuList); 

       if(childMenuList.size() > 0) 
        mainMenuList.add(childMenuList.get(0)); 
       else 
       { 
        mainMenuView = new MenuView(menuView.getId(), menuView.getMenuName(), menuView.getParentId(), menuView.getOrder(), childMenuList);   
        mainMenuList.add(mainMenuView); 
       } 
      }    

      index++; 
     } 

     printRecursiveList(mainMenuList); 
    } 


    private static void findChildIndex(int parentIndex, ArrayList<MenuView> menuList, ArrayList<MenuView> childMenuList) 
    { 
     MenuView mView = null; 
     List<Integer> childIdxList = getChildIndex(parentIndex, menuList); 

     if(childIdxList.size() > 0) 
     { 
      ArrayList<MenuView> childMenuLst = new ArrayList<MenuView>(); 

      for(Integer parentIdx : childIdxList) 
      { 
       findChildIndex(parentIdx, menuList, childMenuLst); 

       if(!hasChilds(parentIdx, menuList)) 
       { 
        mView = new MenuView(menuList.get(parentIdx).getId(), menuList.get(parentIdx).getMenuName(), menuList.get(parentIdx).getParentId(), menuList.get(parentIdx).getOrder(), new ArrayList<MenuView>());// menuList.get(parentIdx).getChilds()); 
        childMenuLst.add(mView); 
       } 
      } 

      mView = new MenuView(menuList.get(parentIndex).getId(), menuList.get(parentIndex).getMenuName(), menuList.get(parentIndex).getParentId(), menuList.get(parentIndex).getOrder(), childMenuLst); 
      childMenuList.add(mView); 

     } 
    } 


    private static List<Integer> getChildIndex(int parentIndex, ArrayList<MenuView> menuList) 
     { 
      List<Integer> childIdxList = new ArrayList<Integer>(); 
      int index = 0; 

      int parentId = menuList.get(parentIndex).getId(); 

      for(MenuView menuView : menuList) 
      { 
       if(menuView.getParentId() == parentId) 
        childIdxList.add(index); 

       index ++; 
      }  

      return childIdxList; 
     } 

    private static boolean hasChilds(int parentIndex, ArrayList<MenuView> menuList) 
    { 
     int parentId = menuList.get(parentIndex).getId(); 

     for(MenuView menuView : menuList) 
     { 
      if(menuView.getParentId() == parentId) 
       return true; 
     } 

     return false; 
    } 


    private static void printRecursiveList(ArrayList<MenuView> mainMenuList) 
    { 
     int i = 0; 

     System.out.println("Size of final list : "+mainMenuList.size()+"\n\n"); 

     while(i < mainMenuList.size()) 
     { 
      System.out.println((i+1)+">>>> "+mainMenuList.get(i).toString()); 
      i++; 
     } 
    }