平面结构数据转关系结构数据

遇到了一个需求 将excel文件内容 导入到mysql数据库中 要求可乱序 如下图
在这里插入图片描述

在这里插入图片描述
考虑许久后决定使用树状结构过度 既能保证关系又无关顺序

首先创建结构对象

映射对象

public class Cate {
    private Integer cateId;

    private Integer parentId;

    private String cateName;

    private Integer level;

    private Byte status = 1;
    ----------------get/set略----------------
}

树对象

public class CateNode {
    private Integer cateId;

    private String cateName;

    private Integer level;

    private Map<String,CateNode> childNodes;
----------------get/set略----------------
}

平面结构转树形结构

----------------文件读取过程略----------------
// 获取最后行号
int lastRowNum = sheet.getLastRowNum();
//记录主键
int cateId = 0;
//创建根节点
CateNode rootNode = new CateNode();
rootNode.setCateId(cateId);
rootNode.setChildNodes(new HashMap<>());
//记录最后节点(临时对象)
CateNode parentNode;
// 循环读取
for (int i = 0; i <= lastRowNum; i++) {
    Row row = sheet.getRow(i);
    //重置临对象
    parentNode = rootNode;
    //减少查询(若父节点不存在表明后面都是新节点)
    Boolean isNew = Boolean.FALSE;
    if (row != null) {
        // 获取前四列每一单元格的值
        for (int j = 0; j < 4; j++) {
            row.getCell(j).setCellType(CellType.STRING);
            String cateName = row.getCell(j).getStringCellValue();
            int level = j+1;
            Map<String,CateNode> brotherNodes = parentNode.getChildNodes();
            //父节点不为新节点则查询
            if(!isNew){
                //存在记录父节点并continue
                if(brotherNodes.containsKey(cateName)){
                    parentNode = brotherNodes.get(cateName);
                    continue;
                }else{
                    isNew = Boolean.TRUE;
                }
            }
            level = j+1;
            CateNode cateNode = new CateNode();
            cateNode.setCateId(++cateId);
            cateNode.setCateName(cateName);
            cateNode.setLevel(level);
            //最末级节点不创建children(递归时停止条件:见下节)
            if (level!=4) {
                cateNode.setChildNodes(new HashMap<>());
            }
            brotherNodes.put(cateName,cateNode);
            //更新临时对象
            parentNode = cateNode;
        }
    }
}

树形结构转关系结构

调用

//树结构转二维结构(递归方法)
List<Cate> cateList = cateTreeToList(rootNode);
----------------对象list入库略----------------

递归

public List<Cate> cateTreeToList(CateNode parentNode){
        List<Cate> cateList = new ArrayList<>();
        if(null == parentNode.getChildNodes()){
            return cateList;
        }
        for(Map.Entry<String, CateNode> entry : parentNode.getChildNodes().entrySet()){
            CateNode cateNode = entry.getValue();
            Cate cate = new Cate();
            cate.setCateId(cateNode.getCateId());
            cate.setParentId(parentNode.getCateId());
            cate.setCateName(cateNode.getCateName());
            cate.setLevel(cateNode.getLevel());
            cateList.add(cate);
            //递归调用点
            cateList.addAll(cateTreeToList(cateNode));
        }
        return cateList;
    }

注意:由于最深层节点childNodes为null无法进去for循环所以可以停止递归

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值