Java中怎样加载一个树状结构对象/集合

    现在有一个集合,集合中的元素具有“父子”关系,即子类的parentId是父类的id。但是这些数据不是严格按照父级子集的树状结构排列,需要在程序中处理一下。

    基本思路:

        1)需要一个特定结构的对象(有id、parentId、children属性,children是一个自身类型的集合),如果源集合(下文中将上面提到的集合统称为源集合)不满足这一结构,需要转换一下;

        2)将这个集合进行两套循环,即内层循环和外层循环。在内层循环中依次查找外层循环中每一个元素的父节点,如果找到了就将其放入外循环的children中,第一次放入children中时,需要先创建children集合,第二次第三次以后放的时候取出此children放入就行。如果没有找到父类,说明它是个根节点,将这个元素放入最先定义的一个目标集合中。

    下面给出一个例子,例子中加入的一点个性化的修改,不过大体思路和上面说的一样:

 

//创建menu树
public List createMenuTree(List menuList) {
        List result = new ArrayList<>();
        List targetList = convert2MJ(menuList);
        for (MenuJson mj1 : targetList) {
            boolean isRoot = true;
            for (MenuJson mj2 : targetList) {
                if (mj2.getId().equals(mj1.getParentId())) {
                	isRoot = false;
                    if (mj2.getChildren() == null) {
                    	mj2.setChildren(new ArrayList());
                    }
                    mj2.getChildren().add(mj1);
                    break;
                }
            }
            for (MenuJson mj2 : targetList) {
            	if(mj1.getId().equals(mj2.getParentId())) {
            		mj1.setState("closed");
            		break;
            	}
            }
            if (isRoot) {
            	result.add(mj1);
            }
        }
        return result;
    }
//转换集合
private List convert2MJ(List menuList) {
		List list = new ArrayList<>();
		for(Menu menu : menuList) {
			MenuJson mj = new MenuJson();
			mj.setAttributes(menu.getUrl());
			mj.setId(menu.getMid());
			mj.setText(menu.getName());
			mj.setParentId(menu.getParentId());
			list.add(mj);
		}
		return list;
	}

    为了适用前端页面的EasyUI的tree,这里将源集合转换成了MenuJson类型的集合。最终处理完是一个集合,如果页面需要的是json类型,可以直接用com.alibaba.fastjson.JSONObject.toJSONString(...)方法转成json字符串。

 

 

你可能感兴趣的:(Java框架)