1. 程式人生 > >組裝樹形結構資料功能封裝

組裝樹形結構資料功能封裝

  • 前言:
  • 由於上一篇部落格只針對於實體TreeNode組裝樹形結構,但是實際開發中,我們對應資料表會建立很多實體來承載資料,反成不能每一種實體都需要寫個遞迴或者迴圈的方法來組裝資料結構吧?下面我將上一拼部落格中的方法再進一步封裝一下,封裝成一個工具類,應對與所有的實體,但是這些實體中,必須含有HashSet型別的 children 成員變數,並生成 get set 方法;必須含有String型別的 id,parentId 成員變數,並且生成get set 方法。
 /**
     * 使用遞迴方法建樹
     * @param
     * @return
     */
    public static <T> List<T> buildTree(List<T> list) throws InvocationTargetException, IllegalAccessException, NoSuchMethodException, IntrospectionException {
        List<T> trees = new ArrayList<>();
        for (T treeNode : list) {
            Method method = treeNode.getClass().getDeclaredMethod("getParentId", null);
            Object value = method.invoke(treeNode, null);
            if ("0".equals(String.valueOf(value))) {
                trees.add(findChildren(treeNode,list));
            }
        }
        return trees;
    }
 public static <T> T findChildren(T t,List<T> treeNodes) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException, IntrospectionException {
        Method getIdMethod = t.getClass().getDeclaredMethod("getId");
        String id = String.valueOf(getIdMethod.invoke(t, null));
        for (T it : treeNodes) {
            Method getParentIdMethod = it.getClass().getDeclaredMethod("getParentId");
            Object parentId = getParentIdMethod.invoke(it, null);
            if (id.equals(String.valueOf(parentId))) {
                Method getChildrenMethod = t.getClass().getDeclaredMethod("getChildren");
                Object children = getChildrenMethod.invoke(t, null);
                if (null == children ) {
                    Method setChildrenMethod = t.getClass().getDeclaredMethod("setChildren",HashSet.class);
                    setChildrenMethod.invoke(t, new HashSet<T>());
                }
                ((HashSet<T>)getChildrenMethod.invoke(t, null)).add(findChildren(it, treeNodes));
            }

        }
        return t;
    }

小結: 以上就是封裝的工具類,本篇部落格只是學習筆記使用,大家有更好的idea歡迎交流,請噴子遠離!