>  기사  >  Java  >  Excel 데이터를 Java의 트리 구조로 변환하는 방법은 무엇입니까?

Excel 데이터를 Java의 트리 구조로 변환하는 방법은 무엇입니까?

WBOY
WBOY앞으로
2023-05-08 08:49:072226검색

머리말

오늘 Excel 데이터를 데이터베이스에 저장해야 하는 가져오기 작업을 받았습니다. 일반 가져오기와 달리 가져온 데이터는 아래와 같이 트리 구조입니다.

Excel 데이터를 Java의 트리 구조로 변환하는 방법은 무엇입니까?

데이터의 데이터를 관찰하여 계층 열을 보면 테이블 데이터가 2개의 트리, 즉 3, 4, 5, 6, 7, 8, 9, 10, 11 및 12, 13, 14, 15, 16, 17, 18로 구성되어 있음을 알 수 있습니다. 0으로 구성 트리의 루트 노드로서 1은 0의 자식 노드이고, 2는 인접한 1의 자식 노드입니다. 이로부터 첫 번째 트리의 구조는 다음과 같습니다.

Excel 데이터를 Java의 트리 구조로 변환하는 방법은 무엇입니까?

원본 데이터를 분할합니다.

1. 엔터티 클래스를 만듭니다.

파싱된 데이터를 받기 위해 vo를 만듭니다. 여기서는 계층적 속성만 고려합니다.

	@Excel(name = "层级")
    private String hierarchy;
    @Excel(name = "物料编码")
    private String materialCode;
    @Excel(name = "物料名称")
    private String materialName;
    @Excel(name = "基础数量")
    private BigDecimal materialNum;
    @Excel(name = "使用数量")
    private BigDecimal useAmount;
    @Excel(name = "BOM版本")
    private String version;
    @Excel(name = "默认BOM")
    private String isDefaults;

2. 데이터 처리

데이터 소스를 여러 트리 데이터 세트로 분할합니다.

코드는 다음과 같습니다. (예):

/**
     * 将集合对象按指定元素分割存储
     *
     * @param materialVos 原始集合
     * @param s 分割元素(这里是当集合对象层级为0时则分割,也就是树的根节点为0)
     * @return 每棵树的结果集
     */
    private List<List<MatMaterialBomImportVo>> subsection(List<MatMaterialBomImportVo> materialVos, String s) {
        List<List<MatMaterialBomImportVo>> segmentedData = new ArrayList<>();
        if (materialVos != null) {
            //获取指定元素的数量,判断出最终将拆分为多少段
            List<MatMaterialBomImportVo> collect = materialVos.stream().filter(bom -> s.equals(bom.getHierarchy())).collect(Collectors.toList());
            int count = 0;
            for (int i = 0; i < collect.size(); i++) {
                List<MatMaterialBomImportVo> bomImportVo = new ArrayList<>();
                boolean num = false;
                //遍历数据源
                for (; count < materialVos.size(); count++) {
                    //第一个必然为树的根节点,直接获取并跳过
                    if (count == 0) {
                        bomImportVo.add(materialVos.get(count));
                        continue;
                    }
                    //当数据源第n个等于根节点并且已经成功添加过数据时判断为一段数据的结束,跳出循环,
                    if (s.equals(materialVos.get(count).getHierarchy()) && num) {
                        break;
                    }
                    bomImportVo.add(materialVos.get(count));
                    num = true;
                }
                segmentedData.add(bomImportVo);
            }
        }
        return segmentedData;
    }

수동 설정 각 트리에 있는 각 노드의 ID와 부모 ID

코드는 다음과 같습니다. (예):

for (List<MatMaterialBomImportVo> segmentedDatum : subsection(materialVos, "0")) {
                //设置id以及父id
                int i = 0;
                for (MatMaterialBomImportVo vo : segmentedDatum) {
                    BeanTrim.beanAttributeValueTrim(vo);
                    vo.setPrimaryKey(i);
                    getParentId(vo, segmentedDatum);
                    i++;
                }
}
/**
     * 设置父id
     *
     * @param vo
     * @param segmentedDatum
     */
    private void getParentId(MatMaterialBomImportVo vo, List<MatMaterialBomImportVo> segmentedDatum) {
        for (int j = vo.getPrimaryKey(); j >= 0; j--) {
            if (Integer.parseInt(segmentedDatum.get(j).getHierarchy()) == Integer.parseInt(vo.getHierarchy()) - 1) {
                vo.setForeignKey(segmentedDatum.get(j).getPrimaryKey());
                break;
            }
            if (j == 0) {
                vo.setForeignKey(-1);
            }
        }
    }

지침: 여러 트리로 분할한 후 각 트리의 가상 ID를 설정합니다. 데이터를 자체 인덱스로 사용하고 각 트리의 ID는 서로 격리되어 있습니다.

테이블 데이터의 규칙에 따르면 하위 노드는 자신의 노드 아래, 다음 동일한 노드 위에만 존재할 수 있다고 결론 내릴 수 있습니다. 이 규칙에 따라 각 노드의 상위 ID를 설정합니다

트리 구조로 반복적으로 캡슐화됩니다

코드는 다음과 같습니다(예제):

/**
     * 递归遍历为树形结构
     *
     * @param vo 当前处理的元素
     * @param segmentedDatum 每棵树的数据集
     */
    private void treeData(MatMaterialBomImportVo vo, List<MatMaterialBomImportVo> segmentedDatum) {
        for (int i = vo.getPrimaryKey(); i < segmentedDatum.size(); i++) {
            if (i + 1 == segmentedDatum.size()) {
                if (vo.getForeignKey() == null) {
                    getParentId(vo, segmentedDatum);
                }
                break;
            }
            int v = Integer.parseInt(vo.getHierarchy());
            int vs = Integer.parseInt(segmentedDatum.get(i + 1).getHierarchy());
            if (vs == v + 1) {
                if (v > 1) {
                    vo.setForeignKey(segmentedDatum.get(i).getPrimaryKey());
                    for (int j = vo.getPrimaryKey(); j > 0; j--) {
                        if (Integer.parseInt(segmentedDatum.get(j).getHierarchy()) == Integer.parseInt(vo.getHierarchy()) - 1) {
                            vo.setForeignKey(segmentedDatum.get(j).getPrimaryKey());
                        }
                    }
                }
                vo.getImportVoList().add(segmentedDatum.get(i + 1));
            }
            if (vs <= v) {
                if (vo.getForeignKey() == null) {
                    for (int j = vo.getPrimaryKey(); j > 0; j--) {
                        if (Integer.parseInt(segmentedDatum.get(j).getHierarchy()) == Integer.parseInt(vo.getHierarchy()) - 1) {
                            vo.setForeignKey(segmentedDatum.get(j).getPrimaryKey());
                            break;
                        }
                    }
                }
                break;
            }
        }
        if (vo.getImportVoList() != null && vo.getImportVoList().size() > 0) {
            for (MatMaterialBomImportVo matMaterialBomImportVo : vo.getImportVoList()) {
                treeData(matMaterialBomImportVo, segmentedDatum);
            }
        }
    }

참고: 여기에 전달한 vo는 ID와 상위 ID를 설정하지 않았습니다. 데이터 소스에 대해서만 트리 분할을 수행했습니다. 비즈니스 요구 사항으로 인해 이 재귀 메서드 집합은 나중에 트리를 조립하는 데 사용되지 않았으므로 참고용으로 재귀 코드에 약간의 오류가 있을 수 있습니다.

위 내용은 Excel 데이터를 Java의 트리 구조로 변환하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제