오늘 Excel 데이터를 데이터베이스에 저장해야 하는 가져오기 작업을 받았습니다. 일반 가져오기와 달리 가져온 데이터는 아래와 같이 트리 구조입니다.
데이터의 데이터를 관찰하여 계층 열을 보면 테이블 데이터가 2개의 트리, 즉 3, 4, 5, 6, 7, 8, 9, 10, 11 및 12, 13, 14, 15, 16, 17, 18로 구성되어 있음을 알 수 있습니다. 0으로 구성 트리의 루트 노드로서 1은 0의 자식 노드이고, 2는 인접한 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;
데이터 소스를 여러 트리 데이터 세트로 분할합니다.
코드는 다음과 같습니다. (예):
/** * 将集合对象按指定元素分割存储 * * @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; }
코드는 다음과 같습니다. (예):
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!