树形结构List转tree(泛型版+普通版)非递归

  public static List<TreeObj> listToTreeList(List<TreeObj> treeList) {
        if(CollectionUtils.isEmpty(treeList)){
            return treeList;
        }
        Map<Integer, List<TreeObj>> treeLevelMap = new HashMap<>();
        Map<String, List<TreeObj>> treeParentCodeMap = new HashMap<>();
        treeList.stream().forEach(x -> {
            //按照树等级分组
            listGroupByGetFun(treeLevelMap,x,x.getLevel());
            //按照父编码分组
            listGroupByGetFun(treeParentCodeMap,x,x.getParentCode());

        });
        List<TreeObj> rootTree = new ArrayList<>();
        //获取树的最大层级
        Integer maxLevel = treeLevelMap.entrySet().stream().map(x -> 
          x.getKey()).max(Integer::compareTo).get();
        int i = 1;
        //循环level
        while (i <= maxLevel) {
            List<TreeObj> currentTreeList = treeLevelMap.get(i);
            currentTreeList.stream().forEach(x -> {
                //设置子集合相当于 x.setChild(list);
                //把当前节点的子集合从treeParentCodeMap中取出通过setChild方法赋值。
                ArrayList<TreeObj> childList = (ArrayList<TreeObj>) 
                treeParentCodeMap.get(x.getCode());
                x.setChild(childList);
            });
            if (i == 1) {
                rootTree.addAll(currentTreeList);
            }
            i++;
        }
        return rootTree;
    }
    private static <K> void listGroupByGetFun(Map<K, List<TreeObj>> map,TreeObj obj,K key) {
        //分组方法(存储分组map,被分组对象)
        //分组属性
        if (key == null) {
            return;
        }
        if (!map.containsKey(key)) {
            map.put(key, new ArrayList<>());
        }
        map.get(key).add(obj);
    }

普通版本

 private static final int LEVEL_INDEX =0;
    private static final int CODE_INDEX =1;
    private static final int PARENT_CODE_INDEX =2;
    private static final int CHILD_LIST_INDEX =3;
    private static Method[] methods;

    public static<T> List<T> listToTreeList(List<T> treeList) {
        if(CollectionUtils.isEmpty(treeList)){
            return treeList;
        }
        Class<T> cls = (Class<T>) treeList.get(0).getClass();
        TreeAnnotations annotation = cls.getAnnotation(TreeAnnotations.class);
        if(null == annotation){
            return treeList;
        }
        TreeUtils.methods = getMethod(cls);
        Map<Integer, List<T>> treeLevelMap = new HashMap<>();
        Map<String, List<T>> treeParentCodeMap = new HashMap<>();
        treeList.stream().forEach(x -> {
            //按照树等级分组
            listGroupByGetFun(treeLevelMap, x, getLevel(x));
            //按照父编码分组
            listGroupByGetFun(treeParentCodeMap,x, getParentCode(x));

        });
        List<T> rootTree = new ArrayList<>();
        //获取最大层级数
        Integer maxLevel = treeLevelMap.entrySet().stream().map(x -> x.getKey()).max(Integer::compareTo).get();
        int i = 1;
        //循环level
        while (i <= maxLevel) {
            List<T> currentTreeList = treeLevelMap.get(i);
            currentTreeList.stream().forEach(x -> {
                //设置子集合相当于 x.setChild(list);
                //把当前节点的子集合从treeParentCodeMap中取出通过setChild方法赋值。
                List<T> childList = treeParentCodeMap.get(getCode(x));
                setChild(x,childList);
            });
            if (i == 1) {
                rootTree.addAll(currentTreeList);
            }
            i++;
        }
        return rootTree;
    }

    //这里为了可读性特意提取出来,后期可自行去留
    private static <T> Integer getLevel(T x){
        return (Integer) getMethod(methods,x,LEVEL_INDEX);
    }
    private static <T> String getParentCode(T x){
        return (String)getMethod(methods,x,PARENT_CODE_INDEX);
    }
    private static <T> String getCode(T x){
        return (String)getMethod(methods,x,CODE_INDEX);
    }
    private static <T> void setChild(T x,List<T> childList){
        setMethod(methods,x,CHILD_LIST_INDEX,childList);
    }

    private static <K,T> void listGroupByGetFun(Map<K, List<T>> map,T obj,K key) {
        //分组方法(存储分组map,被分组对象)
        //分组属性
        if (key == null) {
            return;
        }
        if (!map.containsKey(key)) {
            map.put(key, new ArrayList<>());
        }
        map.get(key).add(obj);
    }

    private static<T> void setMethod(Method[] methods,T t,int index,Object setValue){
        try {
            methods[index].invoke(t,setValue);
        } catch (IllegalAccessException | InvocationTargetException e) {
            e.printStackTrace();
        }
    }
    private static<T> Object getMethod(Method[] methods,T t,int index){
        try {
            return methods[index].invoke(t);
        } catch (IllegalAccessException | InvocationTargetException e) {
            e.printStackTrace();
        }
        return null;
    }
    private static<T> Method[] getMethod(Class<T> cls){
        Method[] methods = new Method[4];
        for(Field field:cls.getDeclaredFields()) {
            try {
                PropertyDescriptor pd = new PropertyDescriptor(field.getName(),cls);
                if(field.isAnnotationPresent(LevelAnnotation.class)){
                    methods[LEVEL_INDEX] = pd.getReadMethod();
                }
                if(field.isAnnotationPresent(CodeAnnotation.class)){
                    methods[CODE_INDEX]= pd.getReadMethod();
                }
                if(field.isAnnotationPresent(ParentCodeAnnotation.class)){
                    methods[PARENT_CODE_INDEX]= pd.getReadMethod();
                }
                if(field.isAnnotationPresent(ChildListAnnotation.class)){
                    methods[CHILD_LIST_INDEX] = pd.getWriteMethod();
                }
            } catch (IntrospectionException e) {
                e.printStackTrace();
            }
        }
        return methods;
    }

泛型通用版本,这个可读性差点,可以先看普通版本再看这个泛型版本。

@Data
@TreeAnnotations()
public class TreeObj {
    private String name;
    @LevelAnnotation
    private Integer level;
    @CodeAnnotation
    private String code;
    @ParentCodeAnnotation
    private String parentCode;
    @ChildListAnnotation
    private ArrayList<TreeObj> child;

    @Override
    public String toString() {
        return "TreeTest{" +
                "name='" + name + '\'' +
                ", level=" + level +
                ", code='" + code + '\'' +
                ", parentCode='" + parentCode + '\'' +
                '}';
    }
}

测试树对象

 注解类就是名字不一样,其他都一样。注解的作用是标识出哪些字段是层级、哪些字段是code。

可以自己根据实际情况变更。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Java中,将List换为树形结构可以通过递归算法来实现。首先,我们需要定义一个节点类Node,其包含一个value属性表示节点的值,以及一个List<Node>属性表示节点的子节点。 使用递归算法,我们可以遍历List,将每个元素作为一个节点添加到中。对于每个节点,我们可以遍历List中的元素,如果元素的父节点值等于当前节点的值,则将该元素作为当前节点的子节点加入中。 具体实现如下: ```java public class Node { private String value; private List<Node> children; public Node(String value) { this.value = value; this.children = new ArrayList<>(); } // getters and setters public static Node convertToTree(List<String> list) { Node root = new Node(""); convertToTree(list, root); return root; } private static void convertToTree(List<String> list, Node parent) { for (String value : list) { if (value.startsWith(parent.getValue())) { Node node = new Node(value); parent.getChildren().add(node); convertToTree(list, node); } } } } ``` 使用示例: ```java List<String> list = Arrays.asList("A", "A_B", "A_C", "A_C_D", "A_C_E", "B", "B_F"); Node root = Node.convertToTree(list); ``` 在上述示例中,我们将字符串列表list换成树形结构,其中每个字符串表示一个节点的值。在换后的中,节点A下有节点B和节点C,节点C下有节点D和节点E,节点B下有节点F。 ### 回答2: 在Java中,将一个List换为树形结构可以通过递归的方式实现。下面是一个基本的示例代码: 首先,我们定义一个TreeNode类,表示中的一个节点: ``` class TreeNode { private int id; private int parentId; private List<TreeNode> children; // 构造函数 public TreeNode(int id, int parentId) { this.id = id; this.parentId = parentId; this.children = new ArrayList<>(); } // Getters 和 Setters ... } ``` 接下来,我们可以编写一个递归的方法,用于将List换为树形结构: ``` public TreeNode buildTree(List<TreeNode> nodeList) { Map<Integer, TreeNode> nodeMap = new HashMap<>(); // 将所有节点以id为key存入map中 for (TreeNode node : nodeList) { nodeMap.put(node.getId(), node); } TreeNode root = null; // 遍历所有节点,通过parentId建立父子关系 for (TreeNode node : nodeList) { int parentId = node.getParentId(); if (parentId == 0) { root = node; // 根节点 } else { TreeNode parent = nodeMap.get(parentId); parent.getChildren().add(node); // 添加子节点 } } return root; // 返回根节点 } ``` 通过调用`buildTree`方法,我们可以将一个List换为树形结构: ``` List<TreeNode> nodeList = new ArrayList<>(); nodeList.add(new TreeNode(1, 0)); nodeList.add(new TreeNode(2, 1)); nodeList.add(new TreeNode(3, 1)); nodeList.add(new TreeNode(4, 2)); TreeNode root = buildTree(nodeList); ``` 这样,我们就成功将一个List换为树形结构了。在上面的例子中,根节点的id为1,其子节点有id为2和3,id为2的节点还有一个子节点id为4。 ### 回答3: Java中可以用List来存储树形结构的数据,然后通过递归的方式将List换为树形结构。 首先,可以定义一个节点类,其中包含节点的值以及节点的子节点列表。例如: ``` class TreeNode { private String value; // 节点的值 private List<TreeNode> children; // 节点的子节点列表 // 构造方法 public TreeNode(String value) { this.value = value; this.children = new ArrayList<>(); } // getter和setter方法 } ``` 然后,可以定义一个工具类来实现List换为树形结构的功能。在这个工具类中,可以使用递归的方式遍历List,使用每个节点的子节点列表来构建树形结构。例如: ``` class TreeUtils { public static TreeNode convertToTree(List<TreeNode> nodeList) { TreeNode root = new TreeNode("root"); // 创建根节点 for (TreeNode node : nodeList) { if (node.getValue().equals(root.getValue())) { continue; // 跳过根节点 } addChild(root, node); // 递归将子节点添加到中 } return root; } private static void addChild(TreeNode parent, TreeNode child) { parent.getChildren().add(child); // 将子节点添加到父节点的子节点列表中 for (TreeNode node : child.getChildren()) { addChild(child, node); // 递归将子节点的子节点添加到中 } } } ``` 最后,可以使用这个工具类将List换为树形结构。例如: ``` List<TreeNode> nodeList = new ArrayList<>(); // 添加节点到列表中 TreeNode tree = TreeUtils.convertToTree(nodeList); // 将列表换为树形结构 ``` 通过以上步骤,就可以将Java中的List换为树形结构,并且可以通过根节点来访问整个的结构和数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值