一个集合,通过任意一个父ID找其下面的所有孩子

//准备实体类
@Data
public class TreeEntity {
    private String id;
    private String pId;
    private String name;
}
/**
 * @Auther: 
 * @Date: 2020/06/08/ 21:35
 * @Description:
 */
public class Demo15 {
    public List<TreeEntity> init() {
        List<TreeEntity> list = new ArrayList<>();
        TreeEntity entity1 = new TreeEntity();
        entity1.setId("1");
        entity1.setPId(null);
        entity1.setName("祖宗");
        list.add(entity1);

        TreeEntity entity2 = new TreeEntity();
        entity2.setId("11");
        entity2.setPId("1");
        entity2.setName("爷爷");
        list.add(entity2);

        TreeEntity entity3 = new TreeEntity();
        entity3.setId("111");
        entity3.setPId("11");
        entity3.setName("爸爸");
        list.add(entity3);


        TreeEntity entity4 = new TreeEntity();
        entity4.setId("1111");
        entity4.setPId("111");
        entity4.setName("儿子");
        list.add(entity4);

        TreeEntity entity5 = new TreeEntity();
        entity5.setId("11111");
        entity5.setPId("1111");
        entity5.setName("孙子");
        list.add(entity5);

        TreeEntity entity6 = new TreeEntity();
        entity6.setId("111111");
        entity6.setPId("11111");
        entity6.setName("重孙子");
        list.add(entity6);

        TreeEntity entity7 = new TreeEntity();
        entity7.setId("1111111");
        entity7.setPId("111111");
        entity7.setName("玄孙子");
        list.add(entity7);
        return list;
    }


    public List<TreeEntity> getChildsByPid(String pId) {//根据id 获取他所有的子节点,包括儿子,孙子....
        List<TreeEntity> list = init();
        //第一步将Pid为空的值过滤掉,因为接下来需要按照Pid进行分组,不允许null
        List<TreeEntity> listForNotNullPid = list.stream().filter(t -> StringUtils.isNotBlank(t.getPId())).collect(Collectors.toList());
        //按照Pid 进行分组
        Map<String, List<TreeEntity>> mapForPid = listForNotNullPid.stream().collect(Collectors.groupingBy(TreeEntity::getPId));
        //准备一个存放所有子节点的集合
        List<TreeEntity> childs = new ArrayList<>();
        searchALLChildByPid(pId, childs, mapForPid);
        return childs;
    }


    public void searchALLChildByPid(String pId, List<TreeEntity> childs, Map<String, List<TreeEntity>> mapForPid) {
        for (Map.Entry<String, List<TreeEntity>> entity : mapForPid.entrySet()) {//循环 这个按照pId分好组的map
            if (pId.equals(entity.getKey())) {//如果Pid 和组的pid相等,说明这一组就是这个pId 的孩子
                childs.addAll(entity.getValue());//收集起来
                List<TreeEntity> value = entity.getValue();//获取该组的所有孩子实体
                for (TreeEntity treeEntity : value) {//循环这一组的孩子,继续找他们的孩子
                    searchALLChildByPid(treeEntity.getId(), childs, mapForPid);
                }
            }
        }
    }

    @Test
    public void test() {
        List<TreeEntity> childs = getChildsByPid("1");
        for (TreeEntity child : childs) {
            System.out.println(child);
        }
    }
}

测试结果: 

再测试一个,将参数改为111,结果:

备注:1.该方法需要基于JAVA8 的一些方法,2.该方法只能返回入参pId的孩子们,不包括入参本身!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值