JAVA中快速构建对象树(O(N))

项目开发中,涉及到公司部门数据展示,或者其他的树关系数据,需要根据数据构建出树级关系。

思路:使用java的对象指针特性,hashMap查找速度快的特点,经过一次for循环迭代构建出完整对的树。

使用要求:对象具有parentId, children[](孩子数组集合)这两个字段。

示范对象:

private String name;
private Integer id;
private Integer fatherId;


@TableField(exist = false)
public List<Department> children = new ArrayList<>();

代码:

// 时间复杂度O(n)
public static List<Department> buildTree(List<Department> list){

    //根节点集合,可能有多个根节点情况。
    List<Department> rootList = new ArrayList<Department>() ;

    //将list转化为map,方便查找
    Map<Integer, Department> map = list.stream().collect(Collectors.toMap(Department::getId, department -> department));

    list.forEach(department -> {
        if(department.getFatherId() == null) //如果父节点为空,则说明是根节点,或者根据其他条件判断
            rootList.add(department);
        else{
            int parentId = department.getFatherId();  //获取父节点id
            map.get(parentId).getChildren().add(department); //将自己添加到父节点中
        }
    });

    return rootList;
}

首先:将原始对象数据放入到map集合中,对象的id作为key,对象 本身作为value,这样可以通过getKey,快速找到对象。

第二步:然后循环遍历原始数据,如果这个对象没有父亲,就把它放进根节点数组保存下来。

如果这个对象有父亲,那么关键的来了,fatherId就是父亲对象的id,所以通过map直接找到父亲在哪里,然后把自己保存到父亲的孩子数组中(指针解释:父亲的孩子数组指向自己(java的引址特性))。

大功告成。

特殊情况:一个我拥有多个父亲的奇遇

1.数据中如果不是用的id作为父标识,使用编码code字段,而且表中有重复编码数据,就是说可能你的数据需要把子树单独领出来作为一个树,例如工艺路线,bom信息这种。
改进方式:万变不离其宗,修改查找map,因为key(code)是相同的,只需stream流的同时进行分类map,就是所map<String,List<对象>>代表着一个编码对应多条数据,原来查找父亲只需要同故宫key,找到一个父亲,但是现在是找到多个干爹(可能有个亲爹),其实都是他的父亲,只是因为这个我太牛逼了,多个树都需要我,比如铁这个物料,自行车bom树,汽车bom树都需要它,就会有多个父亲。
然后你找到父亲的时候,循环遍历自己,把自己放进去就行了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值