在系统开发过程中,可能会碰到一些需求,需要构建树形结构,当用两个字段造树时遇到各自不同的问题。虽然可以通过数据库SQL查询,但我们一般都是通过SQL一次性查询出所有数据,在程序中处理成树形结构。仅记录参考使用!
常见问题:
1、死循环
2、数据重复
3、父级数据丢失等
通过自己的实例经理总结了如下方法
//对象
@Data
public class Sx_testListVO{
@JSONField(name = "fullname")
private String fullname;
@JSONField(name = "subname")
private String subname;
@JSONField(name = "children")
private List<Sx_testListVO> children;
}
//获取父级
List<Sx_testListVO> realListVo = new ArrayList<>();
List<Sx_testListVO> listhas = new ArrayList<>();//创建一个存储list,遍历过就添加进来
for (int i = 0; i < listVO.size(); i++) {
Sx_testListVO item = listVO.get(i);
if (StringUtil.isEmpty(item.getFullname()) || "[]".equals(item.getFullname())) {
realListVo.add(findChild(item, listVO,listhas));//递归获取子集
}
}
//递归方法
private static Sx_testListVO findChild(Sx_testListVO node, List<Sx_testListVO> list,List<Sx_testListVO> listhas) {
listhas.add(node);//添加已遍历过的对象
for (int i = 0; i < list.size(); i++) {
Sx_testListVO n = list.get(i);
if(listhas.contains(n)) {
continue;
}
if (!StringUtil.isEmpty(node.getSubname()) && node.getSubname().equals(n.getFullname())) {
if (node.getChildren() == null) {
node.setChildren(new ArrayList<>());
}
node.getChildren().add(findChild(n, list, listhas));
}
}
return node;
}
以上方法可解决遇到的相关问题,可参考。