测试类
public class A{
private Integer id;
private Integer parantId;
private String name;
private List<A> children=new ArrayList<A>();
public List<A> getChildren() {
return children;
}
public void setChildren(List<A> children) {
this.children = children;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getParantId() {
return parantId;
}
public void setParantId(Integer parantId) {
this.parantId = parantId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class TreeUtil {
public static <T,M> List<T> toTree(List<T> data,TreeGetList<T> callList,
TreeGetCode<M,T> code,TreeGetCode<M,T> pcode
){
Map<M,T> groupData=new HashMap<M,T>();
for(T t:data) {
groupData.put(code.getCode(t), t);
}
data.forEach(m->{
M paran=pcode.getCode(m);
if(paran!=null&&groupData.containsKey(paran)) {
List<T> d= callList.getList(groupData.get(paran));
d.add(m);
}
});
for(int j=data.size()-1;j>=0;j--) {
M paran= pcode.getCode(data.get(j));
if(!(paran==null||!groupData.containsKey(paran))) {
data.remove(j);
}
}
return data;
}
public interface TreeGetList<T>{
public List<T> getList(T t);
}
public interface TreeGetCode<T,M>{
public T getCode(M m);
}
}
最后main 调用测试
public static void main(String ...args) {
A o=new A();
o.setId(1);
A o1=new A();
o1.setId(2);
o1.setParantId(1);
List<A> data=new ArrayList<A>();
data.add(o);
data.add(o1);
A o3=new A();
o3.setId(55);
o3.setParantId(1);
data.add(o3);
data=
TreeUtil.toTree(
data, //数据源
m->m.getChildren() //获取子节点列表
, m->m.getId() //获取id
,m->m.getParantId() //获取父节点id
);
System.out.println(JSONObject.toJSONString(data));
}
var toTree=function(data,id,pid,childName){
var pdata={};
for(var i=0;i<data.length;i++){
var key=data[i][pid];
if(!pdata[key]){
pdata[key]=[];
}
pdata[key].push(data[i]);
}
//构建下级关系
for(var i=0;i<data.length;i++){
if(pdata[data[i][id]]){
data[i][childName]=pdata[data[i][id]];
for(var q=0;q<data[i][childName].length;q++){
data[i][childName][q].delete=true;
}
}
}
for(var i=data.length-1;i>=0;i--){
if(data[i].delete){ //删除节点数据
delete data[i].delete;
data.splice(i,1);
}
}
return data;
}
测试代码
toTree([{id:1,pid:null},{id:2,pid:1},{id:3,pid:2}],"id","pid","list")