diff --git a/README.en.md b/README.en.md index ca78df24870acbda116c2ea9b27c3b3466c1c2aa..ca1e7d7e39f1526a5a0b55f11006a9705a7dc334 100644 --- a/README.en.md +++ b/README.en.md @@ -1,4 +1,4 @@ -# java-based +# java-base #### Description 编写Java基础 diff --git a/README.md b/README.md index 75f3d0e21d2c61210efd25d9588187332805f8c9..52ffb39b4b385862dba5599fdaad2c7c2336c52a 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# java-based +# java-base #### 介绍 编写Java基础 diff --git a/pom.xml b/pom.xml index e5928be7fe1c9d70d67a0fbf26cefd9e03b73b96..9c8144f604ed028f7b9904a495e697a719cd3431 100644 --- a/pom.xml +++ b/pom.xml @@ -1,23 +1,54 @@ - + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.6.3 + + + com.example + java-base + 0.0.1-SNAPSHOT + java-based + Demo project for Spring Boot + + 1.8 + + + + org.springframework.boot + spring-boot-starter + - org.example - java-based - 1.0-SNAPSHOT + + org.projectlombok + lombok + true + + + org.springframework.boot + spring-boot-starter-test + test + + - org.apache.maven.plugins - maven-compiler-plugin + org.springframework.boot + spring-boot-maven-plugin - 1.8 - 1.8 + + + org.projectlombok + lombok + + - \ No newline at end of file + + diff --git a/src/main/java/com/example/javabase/JavaBasedApplication.java b/src/main/java/com/example/javabase/JavaBasedApplication.java new file mode 100644 index 0000000000000000000000000000000000000000..05e0dac97e2eab9247e515510ec099812b983785 --- /dev/null +++ b/src/main/java/com/example/javabase/JavaBasedApplication.java @@ -0,0 +1,13 @@ +package com.example.javabase; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class JavaBasedApplication { + + public static void main(String[] args) { + SpringApplication.run(JavaBasedApplication.class, args); + } + +} diff --git a/src/main/java/com/example/javabase/entity/WorkTaskRegisterDto.java b/src/main/java/com/example/javabase/entity/WorkTaskRegisterDto.java new file mode 100644 index 0000000000000000000000000000000000000000..8892d3a378826e7ea9d7f9293b31790e0788dfaf --- /dev/null +++ b/src/main/java/com/example/javabase/entity/WorkTaskRegisterDto.java @@ -0,0 +1,61 @@ +package com.example.javabase.entity; + +import lombok.Data; + +import java.util.Date; +import java.util.List; + +/** + * 工作任务 + */ +@Data +public class WorkTaskRegisterDto { + + /** + * 主键ID + */ + private String id; + + /** + * 工作任务标题 + */ + private String taskName; + + /** + * 工作任务类型 + */ + private String taskType; + + /** + * 任务级别 + */ + private String taskLevel; + + /** + * 完成期限 + */ + private Date completeTime; + + /** + * 父级任务ID + */ + private String parentId; + + /** + * 是否为末级(0否,1是) + */ + private String isEnd; + + public List children; + + /** + * 牵头单位字符串 + */ + private String leadDepartNames; + + /** + * 配合单位字符串 + */ + private String cooperateDepartNames; + +} diff --git a/src/main/java/com/example/javabase/tools/RecursionUtils.java b/src/main/java/com/example/javabase/tools/RecursionUtils.java new file mode 100644 index 0000000000000000000000000000000000000000..eca89339a4351df5ba115b58d1cb7c7719e43df7 --- /dev/null +++ b/src/main/java/com/example/javabase/tools/RecursionUtils.java @@ -0,0 +1,49 @@ +package com.example.javabase.tools; + + +import com.example.javabase.entity.WorkTaskRegisterDto; +import org.springframework.util.StringUtils; + +import java.util.ArrayList; +import java.util.List; + +public class RecursionUtils { + + public static void main(String[] args) { + + } + + //建立树形结构 + public List buildTree(List departList) { + List treeMenus = new ArrayList<>(); + for (WorkTaskRegisterDto menuNode : getRootNode(departList)) { + buildChildTree(departList, menuNode); + treeMenus.add(menuNode); + } + return treeMenus; + } + + //递归,建立子树形结构 + private WorkTaskRegisterDto buildChildTree(List departList, WorkTaskRegisterDto pNode) { + List childDepart = new ArrayList<>(); + for (WorkTaskRegisterDto menuNode : departList) { + if (!StringUtils.isEmpty(menuNode.getParentId()) && menuNode.getParentId().equals(pNode.getId())) { + childDepart.add(buildChildTree(departList, menuNode)); + } + } + pNode.setChildren(childDepart); + return pNode; + } + + //获取根节点 + private List getRootNode(List departList) { + List rootMenuLists = new ArrayList<>(); + for (WorkTaskRegisterDto menuNode : departList) { + if (StringUtils.isEmpty(menuNode.getParentId())) { + rootMenuLists.add(menuNode); + } + } + return rootMenuLists; + } + +} diff --git a/src/main/java/com/example/javabase/tools/RecursionUtils1.java b/src/main/java/com/example/javabase/tools/RecursionUtils1.java new file mode 100644 index 0000000000000000000000000000000000000000..4e9833b6a1cc7a60db79e3933da8b292fa5f79bf --- /dev/null +++ b/src/main/java/com/example/javabase/tools/RecursionUtils1.java @@ -0,0 +1,177 @@ +package com.example.javabase.tools; + + +import com.example.javabase.entity.WorkTaskRegisterDto; +import org.springframework.util.StringUtils; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class RecursionUtils1 { + + public static void main(String[] args) { + + } + + /** + * 说明方法描述:将list转为树tree结构 + */ + public List useListRecordToTree(List allRecords) { + List listParentRecord = new ArrayList<>(); + List listNotParentRecord = new ArrayList<>(); + // 第一步:遍历allRecords保存所有数据的uuid用于判断是不是根节点 + Map mapAllUuid = new HashMap<>(); + //Map allRecordMap = new HashMap<>(); + for (WorkTaskRegisterDto record : allRecords) { + mapAllUuid.put(record.getId(), record.getId()); + //allRecordMap.put(record.getId(), record); + } + // 第二步:遍历allRecords找出所有的根节点和非根节点 + if (allRecords.size() > 0) { + for (WorkTaskRegisterDto record : allRecords) { + if (StringUtils.isEmpty(record.getParentId()) + || !mapAllUuid.containsKey(record.getParentId())) { + listParentRecord.add(record); + } else { + listNotParentRecord.add(record); + } + } + } + + // 第三步: 递归获取所有子节点 + if (listParentRecord.size() > 0) { + for (WorkTaskRegisterDto record : listParentRecord) { + // 添加所有子级 + record.setChildren(this.getTreeChildRecord(listNotParentRecord, record.getId())); + } + } + return listParentRecord; + } + + /** + * 说明方法描述:使list转换为树并根据关键字和节点名称过滤 + * + * @param allRecords 所有节点 + * @param keywords 要过滤的关键字 + * @param filterFields 要过滤的字段 + */ + public List useListRecordToTreeByKeywords(List allRecords, String keywords, String... filterFields) { + List listRecord = new ArrayList<>(); + Map allRecordMap = new HashMap<>(); + for (WorkTaskRegisterDto record : allRecords) { + allRecordMap.put(record.getId(), record); + } + // 遍历allRecords找出所有的nodeName和关键字keywords相关的数据 + if (allRecords.size() > 0) { + for (WorkTaskRegisterDto record : allRecords) { + // 比较 + if (record.getTaskName().contains(keywords)) { + listRecord.add(record); + } + } + /*if (filterFields.length > 1) { + for (WorkTaskRegisterDto record : allRecords) { + for (String field : filterFields) { + // 比较 + if (record.getStr(field).toLowerCase().indexOf(keywords.toLowerCase()) != -1) { + listRecord.add(record); + } + } + } + } else { + for (WorkTaskRegisterDto record : allRecords) { + // 比较 + if (record.getStr(filterFields[0]).toLowerCase().indexOf(keywords.toLowerCase()) != -1) { + listRecord.add(record); + } + } + }*/ + } + // 查找过滤出来的节点和他们的父节点 + listRecord = this.getSelfAndTheirParentRecord(listRecord, new ArrayList<>(), + new HashMap<>(), allRecordMap); + // 将过滤出来的数据变成树tree结构 + listRecord = this.useListRecordToTree(listRecord); + return listRecord; + } + + /** + * 说明方法描述:递归查询子节点 + * + * @param childList 子节点 + * @param parentUuid 父节点id + */ + private List getTreeChildRecord(List childList, String parentUuid) { + List listParentRecord = new ArrayList<>(); + List listNotParentRecord = new ArrayList<>(); + // 遍历tmpList,找出所有的根节点和非根节点 + if (childList != null && childList.size() > 0) { + for (WorkTaskRegisterDto record : childList) { + // 对比找出父节点 + if (record.getParentId().equals(parentUuid)) { + listParentRecord.add(record); + } else { + listNotParentRecord.add(record); + } + + } + } + // 查询子节点 + if (listParentRecord.size() > 0) { + for (WorkTaskRegisterDto record : listParentRecord) { + // 递归查询子节点 + record.setChildren(getTreeChildRecord(listNotParentRecord, record.getId())); + } + } + return listParentRecord; + } + + /** + * 说明方法描述:递归找出本节点和他们的父节点 + * + * @param parentList 根据关键字过滤出来的相关节点的父节点 + * @param resultList 返回的过滤出来的节点 + * @param filterRecordMap 已经过滤出来的节点 + * @param allRecordMap 所有节点 + */ + private List getSelfAndTheirParentRecord(List parentList, List resultList, + Map filterRecordMap, + Map allRecordMap) { + // 当父节点为null或者节点数量为0时返回结果,退出递归 + if (parentList == null || parentList.size() == 0) { + return resultList; + } + // 重新创建父节点集合 + List listParentRecord = new ArrayList<>(); + // 遍历已经过滤出来的节点 + for (WorkTaskRegisterDto record : parentList) { + + String uuid = record.getId(); + String parent_uuid = record.getParentId(); + + // 如果已经过滤出来的节点不存在则添加到list中 + if (!filterRecordMap.containsKey(uuid)) { + listParentRecord.add(record);// 添加到父节点中 + filterRecordMap.put(uuid, record);// 添加到已过滤的map中 + allRecordMap.remove(uuid);// 移除集合中相应的元素 + resultList.add(record);// 添加到结果集中 + } + + // 找出本节点的父节点并添加到listParentRecord父节点集合中,并移除集合中相应的元素 + if (StringUtils.isEmpty(parent_uuid)) { + WorkTaskRegisterDto parentRecord = allRecordMap.get(parent_uuid); + if (parentRecord != null) { + listParentRecord.add(parentRecord); + allRecordMap.remove(parent_uuid); + } + } + + } + // 递归调用 + getSelfAndTheirParentRecord(listParentRecord, resultList, filterRecordMap, allRecordMap); + return resultList; + } + +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties new file mode 100644 index 0000000000000000000000000000000000000000..8b137891791fe96927ad78e64b0aad7bded08bdc --- /dev/null +++ b/src/main/resources/application.properties @@ -0,0 +1 @@ + diff --git a/src/test/java/com/example/javabase/JavaBasedApplicationTests.java b/src/test/java/com/example/javabase/JavaBasedApplicationTests.java new file mode 100644 index 0000000000000000000000000000000000000000..f7d8045b44738ad9d2e62b4575d7f77a0090672e --- /dev/null +++ b/src/test/java/com/example/javabase/JavaBasedApplicationTests.java @@ -0,0 +1,13 @@ +package com.example.javabase; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class JavaBasedApplicationTests { + + @Test + void contextLoads() { + } + +}