平铺数据结构转成树状数据的方式有很多,本文采用,双循环实现,用1.8的新特性流会比较优雅,也很容易懂。
package com.ruoyi.web.controller.common;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.function.Function;
import java.util.stream.Collectors;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
@Data
@Getter
@Setter
public class test {
int id;
int pid;
List<test> Children;
static final Function<List<test>,List<test>> MULTI_TREE_CONVERTER = sources->
sources.stream()
.filter(item->{
item.setChildren(
sources.stream()
.filter(e-> Objects.equals(e.getPid(), item.getId()))
.collect(Collectors.toList()));
return item.getPid() == 0;})
.collect(Collectors.toList());
public static void main(String[] args) {
List<test> list =new ArrayList<test>();
test test = new test();
test.setId(1);
test.setPid(0);
test t = new test();
t.setId(2);
t.setPid(1);
test t1 = new test();
t1.setId(3);
t1.setPid(1);
test t2 = new test();
t2.setId(4);
t2.setPid(2);
list.add(test);
list.add(t);
list.add(t1);
list.add(t2);
List<com.ruoyi.web.controller.common.test> tests = buildTreeBy2Loop(list, 0);
System.out.println(tests);
System.out.println("-------------");
for (com.ruoyi.web.controller.common.test test1 : MULTI_TREE_CONVERTER.apply(list)) {
System.out.println(test1);
}
}
public static List<test> buildTreeBy2Loop(List<test> treeNodes, int root) {
List<test> trees = new ArrayList<>();
for (test node : treeNodes) {
if (root==(node.getPid())) {
trees.add(node);
}
for (test treeNode : treeNodes) {
if (node.getId()==treeNode.getPid()) {
if (node.getChildren()==null) {
node.setChildren(new ArrayList<>());
}
node.getChildren().add(treeNode);
}
}
}
return trees;
}
}
代码完美运行,本文阐述双循环实现。