我从数据库中获取记录,其中每个记录都有父列和子列,我将这些记录作为数组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作为子节点,依此类推......
答案 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++;
}
}