说明:只是一个简单的数据工具类封装,将集和数据处理成递归数据,支持数据量比较小,如果数据量比较大的时候,可以使用多线程。
import lombok.Data;
import org.apache.commons.lang.StringUtils;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
/**
* @author 李庆伟
* @date 2022/11/15 14:26
*/
public class TreeUtil {
@Data
static class RecursionModel{
private String id;
private String name;
private String pid;
private List<RecursionModel> children;
}
/**
* 使用递归对象中必须存在 idName和pidName,childrenName; 否则报错
* idName:实体ID字段,不是值
* pidName:实体PID字段,不是值
* childrenName:实体子字段【children】,不是值
* @return {@link T}
* @throws
* @author 李庆伟
* @date 2022/11/15 16:22
*/
public static <T> T makeChildren(T t, List<T> list, String idName, String pidName,String childrenName){
List<T> childList = new ArrayList<T>();
for(int a = 0 ; a<list.size(); a++){
String id = getFieldValueByClass(t,idName);
String pid = getFieldValueByClass(list.get(a),pidName);
if(StringUtils.isNotEmpty(pid) && pid.equals(id)){
childList.add(makeChildren(list.get(a),list,idName,pidName,childrenName));
}
}
setFieldValueByClass(t,childrenName,childList);
return t;
}
public static void main(String[] args) {
List<RecursionModel> list = new ArrayList<>();
//test2();
RecursionModel m0 = new RecursionModel();
m0.setId("0");
m0.setName("我是0");
m0.setPid("-1");
list.add(m0);
RecursionModel m01 = new RecursionModel();
m01.setId("01");
m01.setName("我是01");
m01.setPid("0");
list.add(m01);
RecursionModel m02 = new RecursionModel();
m02.setId("02");
m02.setName("我是02");
m02.setPid("0");
list.add(m02);
RecursionModel m001 = new RecursionModel();
m001.setId("0101");
m001.setName("我是0101");
m001.setPid("01");
list.add(m001);
RecursionModel root = makeChildren(m0,list,"id","pid","children");
System.out.println(root);
System.out.println(root);
}
/**
* 反射
* 属性取值
* @param t 实例
* @param field 取值字段
* @return
*/
public static <T> String getFieldValueByClass(T t, String field) {
Class<?> aClass = t.getClass();
try {
Field f = aClass.getDeclaredField(field);
f.setAccessible(true);
return (String) f.get(t);
} catch (Exception e) {
e.printStackTrace();
}
return "";
}
/**
* 反射
* 对象属性赋值
* @param t 实例
* @param field 赋值的字段
* @param value 赋的值
* @return
*/
public static <T> void setFieldValueByClass(T t,String field,List<T> value) {
Class<?> aClass = t.getClass();
Field f = null;
try {
f = aClass.getDeclaredField(field);
f.setAccessible(true);
f.set(t, value);
} catch (Exception e) {
e.printStackTrace();
}
}
}