Java怎么用递归实现树形结构的工具类 |
您所在的位置:网站首页 › 前端查询数据库怎么用 › Java怎么用递归实现树形结构的工具类 |
需求描述 有时候,我们的数据是带有层级的,比如常见的省市区三级联动,就是一层套着一层,如下图: 而我们在数据库存放数据的时候,往往是列表形式的,如下图: 那么当我们从数据库查询出来,返回给前端的时候,前端又需要给出树形层级的时候,这个时候可能就需要递归处理为树形结构了,因此下面这个工具或许就可以用得上了。 使用示例我们按照上面定义一个Place对象,打上工具注解: @TreeKey 标识唯一 @TreeParentKey 标识父节点标识 @TreeChildren 标识子孙节点集合 @Data @Data public class Place { @TreeKey private String id; @TreeParentKey private String parentId; private String name; @TreeChildren private List children; public Place(String id, String name, String parentId) { this.id = id; this.name = name; this.parentId = parentId; } }登录后复制测试: public class Test { public static void main(String[] args) { List places = new ArrayList(); places.add(new Place("510000", "四川省", "0")); places.add(new Place("510100", "成都市", "510000")); places.add(new Place("510107", "武侯区", "510100")); places.add(new Place("510116", "双流区", "510100")); places.add(new Place("511600", "广安市", "510000")); places.add(new Place("511603", "前锋区", "511600")); places.add(new Place("511621", "岳池县", "511600")); List treeList = TreeUtils.getTree(places, "0"); System.out.println(JSON.toJSONString(treeList)); } }登录后复制最终效果: @TreeKey import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface TreeKey { }登录后复制@TreeParentKey import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface TreeParentKey { }登录后复制@TreeChildren import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface TreeChildren { }登录后复制@TreeUtils package com.csd.utils.tree; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Objects; /** * 递归求树形工具类 * * @author Yuanqiang.Zhang * @since 2023/3/8 */ public class TreeUtils { /** * 集合转化为树形 * * @param list 集合 * @param highestParentKey 最高层父节点值 * @param 泛型 * @return 树形 */ public static List getTree(List list, Object highestParentKey) { if (Objects.isNull(list) || list.isEmpty()) { return Collections.emptyList(); } Field key = null; Field parentKey = null; Field children = null; Field[] fields = list.get(0).getClass().getDeclaredFields(); for (Field field : fields) { if (Objects.isNull(key)) { TreeKey treeKey = field.getAnnotation(TreeKey.class); if (Objects.nonNull(treeKey)) { key = field; continue; } } if (Objects.isNull(parentKey)) { TreeParentKey treeParentKey = field.getAnnotation(TreeParentKey.class); if (Objects.nonNull(treeParentKey)) { parentKey = field; continue; } } if (Objects.isNull(children)) { TreeChildren treeChildren = field.getAnnotation(TreeChildren.class); if (Objects.nonNull(treeChildren)) { children = field; continue; } } } if (Objects.isNull(key) || Objects.isNull(parentKey) || Objects.isNull(children)) { return Collections.emptyList(); } key.setAccessible(true); parentKey.setAccessible(true); children.setAccessible(true); // 获取最高层数据 List highs = new ArrayList(); try { for (T t : list) { Object pk = parentKey.get(t); if (getString(pk).equals(getString(highestParentKey))) { highs.add(t); } } // 获取最高层子孙节点 for (T t : highs) { setChildren(list, t, key, parentKey, children); } } catch (IllegalAccessException e) { e.printStackTrace(); } return highs; } /** * 获取子孙节点 * * @param list 集合 * @param parent 父节点对象 * @param key 唯一属性 * @param parentKey 父唯一属性 * @param children 节点 * @param 泛型 * @return 带有子孙集合的父节点对象 * @throws IllegalAccessException */ private static T setChildren(List list, T parent, Field key, Field parentKey, Field children) throws IllegalAccessException { Object k = key.get(parent); List tempList = new ArrayList(); for (T t : list) { Object pk = parentKey.get(t); if (getString(k).equals(getString(pk))) { tempList.add(setChildren(list, t, key, parentKey, children)); } } children.set(parent, tempList); return parent; } /** * 获取字符串 * * @param o 值 * @return 字符串 */ private static String getString(Object o) { return Objects.isNull(o) ? "" : o.toString(); } }登录后复制以上就是Java怎么用递归实现树形结构的工具类的详细内容,更多请关注php中文网其它相关文章! |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |