java递归树
需求
最近在做一棵资料树时,遇到业务需求:父节点状态改变,则子节点状态要一致。
实现思路
首先获取该节点的id,随后利用递归遍历出所有子节点,再将这些子节点状态修改为父节点的状态
实现代码
业务部分
/** 用于存放子节点的集合 */
List<Long> sonIds = new ArrayList<>();
/**
* 修改大纲关系
*
* @param baseRough 大纲关系
* @return 结果
*/
@Override
public int updateBaseRough(BaseRough baseRough)
{
// 添加修改人
SysUser user= ShiroUtils.getSysUser();
baseRough.setUpdateby(user.getUserName());
// 添加修改时间
baseRough.setUpdatetime(DateUtils.getNowDate());
// 根据id查询出原来的大纲状态
Integer exRoughStatus = baseRoughMapper.selectBaseRoughById(baseRough.getRoughId()).getRoughStatus();
Integer roughStatus = baseRough.getRoughStatus();
// 与传入的大纲状态比较
if (!(exRoughStatus == roughStatus)){
BaseRough base = new BaseRough();
// 不相等说明改变了大纲状态
recursionSon(baseRough.getRoughId());
// 将集合中的每一个大纲的状态修改为传入的大纲状态
for (Long sonId : sonIds) {
// 设置属性
base.setRoughId(sonId);
base.setRoughStatus(roughStatus);
baseRoughMapper.updateStatus(base);
}
// 结束后将sonIds清空
sonIds.clear();
}
return baseRoughMapper.updateBaseRough(baseRough);
}
递归代码
@Override
public void recursionSon(Long roughId) {
// 查询出该节点下的所有子节点
List<Long> sons = baseRoughMapper.selectSonIds(roughId);
if (!sons.isEmpty()){
// 添加
sonIds.addAll(sons);
// 不为空则递归
for (Long son : sons) {
recursionSon(son);
}
}
}
实现效果
当一个节点状态改变后,其下的所有子节点状态也都改变