Java树形结构 递归

准备好实体对象

@Data
@Accessors(chain = true)
public class TreeDTO {
    /**
     * 节点id
     */
    private Integer id;

    /**
     * 节点名称
     */
    private String name;

    /**
     * 作为子节点时,所依赖的父节点id(属于哪个父节点)
     */
    public Integer parentId;

    /**
     * 子节数据
     */
    public List childList=new ArrayList<>();
}

实现详情

@Service
public class TreeServiceImpl implements TreeService{
    @Override
    public List list() {
        List result = fill();
        //记录需要被移除的对象
        List rmDTO = new ArrayList<>();
        //外层循环父节点
        for (int i = 0; i < result.size(); i++) {
            TreeDTO treeDTO = result.get(i);
            Integer id = treeDTO.getId();
            //内层循环子节点
            for (int j = 0; j < result.size(); j++) {
                TreeDTO childDTO = result.get(j);
                //子节点所依赖的父亲节点id
                Integer childSParentId = childDTO.getParentId();
                //如果子节点所依赖的父亲节点id等于父节点的id
                if (childSParentId == id) {
                    //对象添加到待移除数组
                    rmDTO.add(childDTO);
                    //递归添加数据
                    treeDTO.getChildList().add(childDTO);
                }
            }

        }
        //移除子数据
        for (TreeDTO treeDTO : rmDTO) {
            result.remove(treeDTO);
        }
        return result;
    }

    /**
     * 构建测试数据
     */
    private List fill() {
        List list = new ArrayList<>(20);
        TreeDTO treeDTO = new TreeDTO();
        list.add(treeDTO.setId(1).setName("河南省").setParentId(0));
        treeDTO = new TreeDTO();
        list.add(treeDTO.setId(2).setName("广东省").setParentId(0));
        treeDTO = new TreeDTO();
        list.add(treeDTO.setId(3).setName("信阳市").setParentId(1));
        treeDTO = new TreeDTO();
        list.add(treeDTO.setId(4).setName("驻马店市").setParentId(1));
        treeDTO = new TreeDTO();
        list.add(treeDTO.setId(5).setName("郑州市").setParentId(1));
        treeDTO = new TreeDTO();
        list.add(treeDTO.setId(6).setName("金水区").setParentId(5));
        treeDTO = new TreeDTO();
        list.add(treeDTO.setId(7).setName("东莞市").setParentId(2));
        treeDTO = new TreeDTO();
        list.add(treeDTO.setId(8).setName("黄江镇").setParentId(7));
        treeDTO = new TreeDTO();
        list.add(treeDTO.setId(9).setName("正阳县").setParentId(4));
        treeDTO = new TreeDTO();
        list.add(treeDTO.setId(10).setName("汝南县").setParentId(4));
        treeDTO = new TreeDTO();
        list.add(treeDTO.setId(11).setName("确山县").setParentId(4));
        treeDTO = new TreeDTO();
        list.add(treeDTO.setId(12).setName("二七区").setParentId(5));
        treeDTO = new TreeDTO();
        list.add(treeDTO.setId(13).setName("潢川县").setParentId(3));
        treeDTO = new TreeDTO();
        list.add(treeDTO.setId(14).setName("息县县").setParentId(3));
        treeDTO = new TreeDTO();
        list.add(treeDTO.setId(15).setName("固始县").setParentId(3));
        treeDTO = new TreeDTO();
        list.add(treeDTO.setId(16).setName("樟木头镇").setParentId(7));
        treeDTO = new TreeDTO();
        list.add(treeDTO.setId(17).setName("塘厦镇").setParentId(7));
        treeDTO = new TreeDTO();
        list.add(treeDTO.setId(18).setName("宝安区").setParentId(20));
        treeDTO = new TreeDTO();
        list.add(treeDTO.setId(19).setName("龙岗区").setParentId(20));
        treeDTO = new TreeDTO();
        list.add(treeDTO.setId(20).setName("深圳市").setParentId(2));
        return list;
    }
}

Java树形结构 递归_第1张图片

Java树形结构 递归_第2张图片

简化

@Service
public class TreeServiceImpl implements TreeService {
    @Override
    public List list() {
        List result = fill();
        List rmDTO = new ArrayList<>();
        result.forEach(parentDTO -> result.forEach(childDTO -> {
            if (Objects.equals(parentDTO.getId(), childDTO.getParentId())) {
                parentDTO.getChildList().add(childDTO);
                rmDTO.add(childDTO);
            }
        }));
        rmDTO.forEach(result::remove);
        return result;
    }

    /**
     * 构建测试数据
     */
    private List fill() {
        List list = new ArrayList<>(20);
        TreeDTO treeDTO = new TreeDTO();
        list.add(treeDTO.setId(1).setName("河南省").setParentId(0));
        treeDTO = new TreeDTO();
        list.add(treeDTO.setId(2).setName("广东省").setParentId(0));
        treeDTO = new TreeDTO();
        list.add(treeDTO.setId(3).setName("信阳市").setParentId(1));
        treeDTO = new TreeDTO();
        list.add(treeDTO.setId(4).setName("驻马店市").setParentId(1));
        treeDTO = new TreeDTO();
        list.add(treeDTO.setId(5).setName("郑州市").setParentId(1));
        treeDTO = new TreeDTO();
        list.add(treeDTO.setId(6).setName("金水区").setParentId(5));
        treeDTO = new TreeDTO();
        list.add(treeDTO.setId(7).setName("东莞市").setParentId(2));
        treeDTO = new TreeDTO();
        list.add(treeDTO.setId(8).setName("黄江镇").setParentId(7));
        treeDTO = new TreeDTO();
        list.add(treeDTO.setId(9).setName("正阳县").setParentId(4));
        treeDTO = new TreeDTO();
        list.add(treeDTO.setId(10).setName("汝南县").setParentId(4));
        treeDTO = new TreeDTO();
        list.add(treeDTO.setId(11).setName("确山县").setParentId(4));
        treeDTO = new TreeDTO();
        list.add(treeDTO.setId(12).setName("二七区").setParentId(5));
        treeDTO = new TreeDTO();
        list.add(treeDTO.setId(13).setName("潢川县").setParentId(3));
        treeDTO = new TreeDTO();
        list.add(treeDTO.setId(14).setName("息县县").setParentId(3));
        treeDTO = new TreeDTO();
        list.add(treeDTO.setId(15).setName("固始县").setParentId(3));
        treeDTO = new TreeDTO();
        list.add(treeDTO.setId(16).setName("樟木头镇").setParentId(7));
        treeDTO = new TreeDTO();
        list.add(treeDTO.setId(17).setName("塘厦镇").setParentId(7));
        treeDTO = new TreeDTO();
        list.add(treeDTO.setId(18).setName("宝安区").setParentId(20));
        treeDTO = new TreeDTO();
        list.add(treeDTO.setId(19).setName("龙岗区").setParentId(20));
        treeDTO = new TreeDTO();
        list.add(treeDTO.setId(20).setName("深圳市").setParentId(2));
        return list;
    }
}

你可能感兴趣的:(java,开发语言)