集合与树形结构
一、注解说明生成树形结构1.1 注解Retention(RetentionPolicy.RUNTIME)Target(ElementType.FIELD)publicinterfaceTreeId{}Retention(RetentionPolicy.RUNTIME)Target(ElementType.FIELD)publicinterfaceTreeParentId{}1.2 树形节点DatapublicclassWisDepartment{privatestaticfinallongserialVersionUID1L;/** * 外部主键id(三方数据id) */TreeIdFieldMapping(sourceName{an_org_id})TableField(EXTERNAL_ID)privateStringexternalId;/** * 外部主键父Id(三方数据父级id) */TreeParentIdFieldMapping(sourceName{parent_id})TableField(EXTERNAL_PARENT_ID)privateStringexternalParentId;/** * 部门名称 */FieldMapping(sourceName{org_name})NotEmpty(message部门名称不能为空)Length(max64,message部门名称长度不能超过64)TableField(NAME)privateStringname;TableField(existfalse)privateListWisDepartmentchildrennewArrayList();}1.3 树形结构构建工具publicclassTreeBuilderT{publicListTbuildTree(ListTnodes)throwsException{if(nodesnull||nodes.isEmpty())returnCollections.emptyList();Class?clazznodes.get(0).getClass();FieldidFieldgetFieldWithAnnotation(clazz,TreeId.class);FieldparentIdFieldgetFieldWithAnnotation(clazz,TreeParentId.class);FieldchildrenFieldgetChildrenField(clazz);idField.setAccessible(true);parentIdField.setAccessible(true);if(childrenField!null)childrenField.setAccessible(true);// 建立id到node的映射MapObject,TidMapnewHashMap();for(Tnode:nodes){ObjectididField.get(node);idMap.put(id,node);}ListTrootsnewArrayList();for(Tnode:nodes){ObjectparentIdparentIdField.get(node);if(!idMap.containsKey(parentId)||parentIdnull||.equals(parentId)){roots.add(node);}else{TparentidMap.get(parentId);if(childrenField!null){ListTchildren(ListT)childrenField.get(parent);if(childrennull){childrennewArrayList();childrenField.set(parent,children);}children.add(node);}}}returnroots;}privateFieldgetFieldWithAnnotation(Class?clazz,Class?extendsjava.lang.annotation.Annotationanno){for(Fieldf:clazz.getDeclaredFields()){if(f.isAnnotationPresent(anno))returnf;}thrownewIllegalArgumentException(No field with annotation anno);}privateFieldgetChildrenField(Class?clazz){for(Fieldf:clazz.getDeclaredFields()){if(children.equals(f.getName()))returnf;}returnnull;}/** * 集合构建树形结构 * 1.数据节点父级id不存在集合中则需要将父级节点设置为根节点 * param nodes * param rootId * return */publicstaticListWisDepartmentbuildTree(ListWisDepartmentnodes,StringrootId){MapString,WisDepartmentidNodeMapnodes.stream().collect(Collectors.toMap(WisDepartment::getExternalId,node-node));ListWisDepartmentrootNodesnewArrayList();for(WisDepartmentnode:nodes){if(rootId.equals(node.getExternalParentId())){// 根节点rootNodes.add(node);}else{// 非根根据parentId 找父节点然后把自己加入父节点的childrenWisDepartmentparentidNodeMap.get(node.getExternalParentId());if(parent!null){parent.getChildren().add(node);}else{node.setExternalParentId(rootId);rootNodes.add(node);}}}returnrootNodes;}publicstaticvoidmain(String[]args)throwsException{ListWisDepartmentdepartmentsJSONArray.parseArray(ss,WisDepartment.class);System.out.println(data1: JSONObject.toJSONString(departments));StringrootId20221206140844614-6ECD-5B3376E42;TreeBuilderWisDepartmentbuildernewTreeBuilder();// ListWisDepartment tree builder.buildTree(departments);ListWisDepartmenttree2builder.buildTree(departments,rootId);////// ListWisDepartment collect departments.stream().filter(m - m.getExternalParentId().equals(rootId)).map(// (m) - {// m.setChildren(getChildrenList(m, departments));// return m;// }// ).collect(Collectors.toList());// System.out.println(JSONObject.toJSONString(collect));System.out.println(data2: JSONObject.toJSONString(departments));}/** * 获取子节点列表 * param tree * param list * return */publicstaticListWisDepartmentgetChildrenList(WisDepartmenttree,ListWisDepartmentlist){ListWisDepartmentchildrenlist.stream().filter(item-item.getExternalParentId().equals(tree.getExternalId())).map((item)-{item.setChildren(getChildrenList(item,list));returnitem;}).collect(Collectors.toList());returnchildren;}publicstaticStringss[\n {\n \an_org_id\: \an001\,\n \externalId\: \an001\,\n \parent_id\: \20221206140844614-6ECD-5B3376E42\,\n \externalParentId\: \20221206140844614-6ECD-5B3376E42\,\n \path\: \父组织路径\,\n \path_name\: \组织全路径名称\,\n \org_level\: \1\,\n \org_name\: \an001bbk\,\n \org_name_abbr\: \组织简称\,\n \org_order\: \1\,\n \an_org_type\: \1\,\n \an_credit_code\: \xfn40\,\n \an_legal_person\: \法定代表人\,\n \sys_org_code\: \创建人所属部门\,\n \org_is_disabled\: \0\,\n \postal_address\: \通讯地址公司/基地\,\n \charge_project_name\: \项目部负责人\\n }, \n\t\t{\n \an_org_id\: \an002\,\n \externalId\: \an002\,\n \parent_id\: \20221206140844614-6ECD-5B3376E42\,\n \externalParentId\: \20221206140844614-6ECD-5B3376E42\,\n \path\: \父组织路径\,\n \path_name\: \组织全路径名称\,\n \org_level\: \1\,\n \org_name\: \an002\,\n \org_name_abbr\: \组织简称\,\n \org_order\: \2\,\n \an_org_type\: \1\,\n \an_credit_code\: \xfn40\,\n \an_legal_person\: \法定代表人\,\n \sys_org_code\: \创建人所属部门\,\n \org_is_disabled\: \0\,\n \postal_address\: \通讯地址公司/基地\,\n \charge_project_name\: \项目部负责人\\n }, \n\t\t{\n \an_org_id\: \an001001\,\n \externalId\: \an001001\,\n \parent_id\: \an002\,\n \externalParentId\: \an002\,\n \path\: \父组织路径\,\n \path_name\: \组织全路径名称\,\n \org_level\: \1\,\n \org_name\: \an001001\,\n \org_name_abbr\: \组织简称\,\n \org_order\: \1\,\n \an_org_type\: \1\,\n \an_credit_code\: \xfn40\,\n \an_legal_person\: \法定代表人/负责人\,\n \sys_org_code\: \创建人所属部门\,\n \org_is_disabled\: \0\,\n \postal_address\: \通讯地址公司/基地\,\n \charge_project_name\: \项目部负责人\\n }\n\t\t, \n\t\t{\n \an_org_id\: \an003\,\n \externalId\: \an003\,\n \parent_id\: \an003\,\n \externalParentId\: \an0039\,\n \path\: \父组织路径\,\n \path_name\: \组织全路径名称\,\n \org_level\: \1\,\n \org_name\: \an003\,\n \org_name_abbr\: \组织简称\,\n \org_order\: \1\,\n \an_org_type\: \1\,\n \an_credit_code\: \xfn40\,\n \an_legal_person\: \法定代表人/负责人\,\n \sys_org_code\: \创建人所属部门\,\n \org_is_disabled\: \0\,\n \postal_address\: \通讯地址公司/基地\,\n \charge_project_name\: \项目部负责人\\n }\n ];}1.4 树形结构从父级到子级遍历/** * 从根节点开始遍历 * param root */publicstaticvoidlevelOrder(WisDepartmentroot){if(rootnull)return;QueueWisDepartmentqueuenewLinkedList();queue.offer(root);while(!queue.isEmpty()){WisDepartmentnodequeue.poll();System.out.println(JSONObject.toJSONString(node));// 访问父节点当前层queue.addAll(node.getChildren());// 子节点加入队尾下一层处理}}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2501902.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!