将list数据转换成树型结构

时间:2022-10-22 13:02:28

经常碰到一个功能,是将一个list的数据转换成数据结构,以前每次都是用递归方式进行组装,后来在网上查找了下,看到利用java反射机制封装的一个公用方法,觉得不错,但是网上能搜索到的发现大部分都是利用实体类的属性,调用clazz.getDeclaredField()方法来实现的,但这样有一定的局限性,该方法只能获取到自身的属性,从父类继承的private属性获取不到,于是把代码修改了下,利用反射方法来实现,代码如下

/**
     * 将list组装成tree
     * @param tree 传入的list
     * @param topParentId 最顶层的父ID
     * @return
     * @throws NoSuchFieldException
     * @throws IllegalAccessException
     */
    public static List toTree(List tree,String topParentId) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        if (tree !=null){
            List t_list = new ArrayList();
            Map map = new HashMap();
            for (Object o : tree){
                Class clazz = o.getClass();
                Method method = clazz.getMethod("getId");
                String id = method.invoke(o).toString();
                map.put(id,o);
            }

            for (Object o : map.keySet()){
                String id = o.toString();
                Object obj = map.get(id);
                Class clazz = obj.getClass();
                Method method = clazz.getMethod("getParentId");
                String parentId = method.invoke(obj).toString();
                if (StringUtils.pathEquals(parentId,topParentId)){
                    //顶层
                    t_list.add(obj);
                }else {
                    //当不是顶层时,获取其父级
                    Object object = map.get(parentId);
                    Class parentClazz = object.getClass();
                    Method getChildren = parentClazz.getMethod("getChildren");
                    //获取其父级的子级,及自己的兄弟(平级)
                    List list =(List) getChildren.invoke(object);
                    if (CollectionUtils.isEmpty(list)){
                        list = new ArrayList();
                    }
                    list.add(obj);
                    Method setChildren = parentClazz.getMethod("setChildren",List.class);
                    setChildren.invoke(object,list);
                }
            }
            return t_list;
        }
        return null;
    }