原文作者:王业群,转载请注明
出处 最近在用easyUI做后台管理,经常会用到树这种结构,在easyUI中树形结构要求返回的格式是下图这样的:
而我们通常从数据库里面查询出来的结果,是一个封装了Bean类的List集合,是一个扁平化的结构 我们发现,需要有一个children属性,所以要想把List集合转换为树形结构,有两个条件:
- 有一个字段与id字段关联,明确上下级关系
- 我们要知道根节点的id 然后我们写一个方法,这个方法有四个参数,
- 第一个参数是要转化的List集合,
- 第二个参数是id字段的名称,
- 第三个参数是与id字段关联的字段的名称,
- 第四个属性是根节点的id;
/**
* 一个将方法名称转换为属性名称的方法
*/
public static String methodName2attributeName(String methodName) {
if(methodName==null) return null;
if(methodName.startsWith("get")){
return (methodName.charAt(3)+"").toLowerCase()+methodName.substring(4,methodName.length());
}
return methodName;
}
/**
* 一个将首字母小写变大写的类
*/
public static String charAt0toUpperCase(String methodName) {
return (methodName.charAt(0)+"").toUpperCase()+methodName.substring(1,methodName.length());
}
*下面是转换工具*
/** 作者:王业群
* 博客:wangyequn.cn
*/
public static <T> List<Map> list2TreeDate(List<T> list, String idAttr, String pidAttr,Object pid) throws Exception {
idAttr = Tool.charAt0toUpperCase(idAttr);
pidAttr = Tool.charAt0toUpperCase(pidAttr);
List<Map> treeDataList = new ArrayList<>();
boolean flag = false;
for (T obj : list) {
//获取目标类
Class<? extends Object> c = obj.getClass();
Method getPid = c.getMethod(("get"+pidAttr));
Object p_id = getPid.invoke(obj);
//如果查询到
if(p_id==pid||(p_id!=null&&p_id.equals(pid))) {
flag=true;
Map map = new HashMap();
Method getId = c.getMethod(("get"+idAttr));
Object id = getId.invoke(obj);
//获取目标类的所有方法
Method[] methods = c.getMethods();
//将目标类的全部属性进行封装
for (Method method : methods) {
if(method.getName().startsWith("get")&&method.getParameterCount()==0) {
Object invoke = method.invoke(obj);
map.put(Tool.methodName2attributeName(method.getName()), invoke);
//System.out.println("执行了"+Tool.methodName2attributeName(method.getName())+"方法得到的值是:"+invoke);
}
}
List<Map> list2TreeDate = list2TreeDate(list,idAttr,pidAttr,id);
map.put("children", list2TreeDate);
treeDataList.add(map);
}
}
return treeDataList;
如果写的不好还请指正