您好,欢迎访问一九零五行业门户网

Java怎么用递归实现树形结构的工具类

需求描述有时候,我们的数据是带有层级的,比如常见的省市区三级联动,就是一层套着一层,如下图:
而我们在数据库存放数据的时候,往往是列表形式的,如下图:
那么当我们从数据库查询出来,返回给前端的时候,前端又需要给出树形层级的时候,这个时候可能就需要递归处理为树形结构了,因此下面这个工具或许就可以用得上了。
使用示例我们按照上面定义一个place对象,打上工具注解:
@treekey 标识唯一
@treeparentkey 标识父节点标识
@treechildren 标识子孙节点集合
@data@datapublic class place { @treekey private string id; @treeparentkey private string parentid; private string name; @treechildren private list<place> 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<place> 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<place> 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 <t> 泛型 * @return 树形 */ public static <t> list<t> gettree(list<t> 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<t> 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 <t> 泛型 * @return 带有子孙集合的父节点对象 * @throws illegalaccessexception */ private static <t> t setchildren(list<t> list, t parent, field key, field parentkey, field children) throws illegalaccessexception { object k = key.get(parent); list<t> 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怎么用递归实现树形结构的工具类的详细内容。
其它类似信息

推荐信息