从从数据库中检索的记录创建java递归数组列表

时间:2014-01-12 21:02:39

标签: java database recursion arraylist

我从数据库中获取记录,其中每个记录都有父列和子列,我将这些记录作为数组List检索。现在我想基于父子关系创建递归数组列表。

假设我正在从数据库中检索List下面

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数组并在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作为子节点,依此类推......

1 个答案:

答案 0 :(得分: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++;
        }
    }