2014-01-12 1 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 в качестве дочерних узлов и так далее ...

Мой класс Node будет, как показано ниже, который я преобразовать в массив JSON и отображения в виде дерева в пользовательском интерфейсе

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++; 
     } 
    } 
Смежные вопросы