Skip to content

Commit 6d3bf5e

Browse files
authored
Merge pull request #4 from b6688c/1.1.5
feat: 增加树数据结构及其相关操作
2 parents c9118bf + 0cab224 commit 6d3bf5e

25 files changed

+532
-213
lines changed

pom.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,14 @@
1010
<version>1.1.5.RELEASE</version>
1111
<description>构建大型应用需要的基本能力 --- all in one</description>
1212
<url>https://github.com/b6688c/uno</url>
13+
1314
<developers>
1415
<developer>
1516
<name>j.x</name>
1617
<email>jiangw1027@gmail.com</email>
1718
</developer>
1819
</developers>
20+
1921
<modules>
2022
<module>uno-bom</module>
2123
<module>uno-core</module>

uno-rule/src/main/java/cc/allio/uno/rule/api/vistor/BreadthTraversalMode.java renamed to uno-core/src/main/java/cc/allio/uno/core/datastructure/tree/BreadthTraversalMode.java

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,28 @@
1-
package cc.allio.uno.rule.api.vistor;
1+
package cc.allio.uno.core.datastructure.tree;
22

33
import cc.allio.uno.core.util.CollectionUtils;
44

55
import java.util.LinkedList;
66
import java.util.Queue;
77

88
/**
9-
* 广度优先
9+
* 树广度优先
1010
*
1111
* @author jiangwei
1212
* @date 2023/4/27 09:17
1313
* @since 1.1.4
1414
*/
1515
public class BreadthTraversalMode implements TraversalMode {
1616

17-
BreadthTraversalMode() {
18-
}
19-
2017
@Override
2118
public void doTraversal(TraversalElement e, Visitor visitor) {
2219
Queue<TraversalElement> bfsQueue = new LinkedList<>();
2320
bfsQueue.add(e);
2421
while (!bfsQueue.isEmpty()) {
2522
TraversalElement element = bfsQueue.poll();
2623
element.doAccept(visitor);
27-
if (CollectionUtils.isNotEmpty(element.getChildrens())) {
28-
element.getChildrens().forEach(bfsQueue::offer);
24+
if (CollectionUtils.isNotEmpty(element.getChildren())) {
25+
element.getChildren().forEach(chd -> bfsQueue.offer((TraversalElement) chd));
2926
}
3027
}
3128
}

uno-rule/src/main/java/cc/allio/uno/rule/api/vistor/DeepTraversalMode.java renamed to uno-core/src/main/java/cc/allio/uno/core/datastructure/tree/DeepTraversalMode.java

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package cc.allio.uno.rule.api.vistor;
1+
package cc.allio.uno.core.datastructure.tree;
22

33
import cc.allio.uno.core.util.CollectionUtils;
44

@@ -15,26 +15,23 @@
1515
*/
1616
public class DeepTraversalMode implements TraversalMode {
1717

18-
DeepTraversalMode() {
19-
}
20-
2118
@Override
2219
public void doTraversal(TraversalElement e, Visitor visitor) {
2320
// 深度优先
2421
Deque<TraversalElement> dfsStack = new ArrayDeque<>();
2522
dfsStack.push(e);
26-
List<TraversalElement> childrens = e.getChildrens();
23+
List<TraversalElement> childrens = e.getChildren();
2724
deepAccept(childrens, dfsStack);
2825
while (!dfsStack.isEmpty()) {
2926
TraversalElement element = dfsStack.pollLast();
3027
element.doAccept(visitor);
3128
}
3229
}
3330

34-
private void deepAccept(List<TraversalElement> childrens, Deque<TraversalElement> dfsStack) {
31+
private void deepAccept(List<? extends TraversalElement> childrens, Deque<TraversalElement> dfsStack) {
3532
if (CollectionUtils.isNotEmpty(childrens)) {
3633
childrens.forEach(dfsStack::offerLast);
37-
childrens.forEach(e -> deepAccept(e.getChildrens(), dfsStack));
34+
childrens.forEach(e -> deepAccept(e.getChildren(), dfsStack));
3835
}
3936
}
4037

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package cc.allio.uno.core.datastructure.tree;
2+
3+
import com.google.common.collect.Lists;
4+
import lombok.Getter;
5+
import lombok.NonNull;
6+
import lombok.Setter;
7+
8+
import java.io.Serializable;
9+
import java.util.List;
10+
11+
/**
12+
* 默认树结点
13+
*
14+
* @author j.x
15+
* @date 2023/11/9 11:36
16+
* @since 1.1.5
17+
*/
18+
@Getter
19+
public class DefaultElement extends TraversalElement {
20+
21+
private final Serializable id;
22+
@Setter
23+
private int depth;
24+
25+
@Setter
26+
private Element parent;
27+
28+
private final List<Element> children;
29+
30+
public DefaultElement(@NonNull Serializable id) {
31+
this.id = id;
32+
this.children = Lists.newArrayList();
33+
}
34+
35+
public DefaultElement(@NonNull Serializable id, int depth) {
36+
this.id = id;
37+
this.depth = depth;
38+
this.children = Lists.newArrayList();
39+
}
40+
41+
@Override
42+
public boolean isLeaf() {
43+
return children.isEmpty();
44+
}
45+
46+
@Override
47+
public <T extends Element> void setChildren(List<T> children) {
48+
clearChildren();
49+
this.children.addAll(children);
50+
}
51+
52+
@Override
53+
public void addChildren(Element element) {
54+
children.add(element);
55+
}
56+
57+
@Override
58+
public void clearChildren() {
59+
children.clear();
60+
}
61+
62+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package cc.allio.uno.core.datastructure.tree;
2+
3+
import java.io.Serializable;
4+
5+
public record DefaultExpand(Serializable id, Serializable parentId) implements Expand {
6+
@Override
7+
public Serializable getId() {
8+
return id;
9+
}
10+
11+
@Override
12+
public Serializable getParentId() {
13+
return parentId;
14+
}
15+
}
Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
package cc.allio.uno.core.datastructure.tree;
2+
3+
import cc.allio.uno.core.StringPool;
4+
5+
import java.io.Serializable;
6+
import java.util.List;
7+
8+
/**
9+
* 节点类型分为两种:
10+
* <ul>
11+
* <li>group 节点</li>
12+
* <li>attr 节点</li>
13+
* </ul>
14+
*
15+
* @author jiangwei
16+
* @date 2023/4/26 11:31
17+
* @since 1.1.4
18+
*/
19+
public interface Element extends Serializable {
20+
21+
Element ROOT_SENTINEL = new DefaultElement(-1, -1);
22+
23+
/**
24+
* 定义根节点
25+
*/
26+
int ROOT_NODE = 0;
27+
28+
/**
29+
* 获取树的标识
30+
*/
31+
Serializable getId();
32+
33+
/**
34+
* 获取节点所在的深度
35+
*
36+
* @return level
37+
*/
38+
int getDepth();
39+
40+
/**
41+
* 设置树的层级
42+
*/
43+
void setDepth(int depth);
44+
45+
/**
46+
* 获取当前树的路径
47+
*
48+
* @return a.b.c以'.'来切分路径标识
49+
*/
50+
default String getPath() {
51+
return getParent() != null ? getParent().getPath() + StringPool.ORIGIN_DOT + getId() : String.valueOf(getId());
52+
}
53+
54+
/**
55+
* 获取父节点
56+
*
57+
* @return Element
58+
*/
59+
<T extends Element> T getParent();
60+
61+
/**
62+
* 设置父节点
63+
*
64+
* @param parent parent node
65+
*/
66+
<T extends Element> void setParent(T parent);
67+
68+
/**
69+
* 是否为根节点
70+
*
71+
* @return true 是 false 否
72+
*/
73+
default boolean isRoot() {
74+
return getDepth() == ROOT_NODE;
75+
}
76+
77+
/**
78+
* 是否为叶子节点
79+
*
80+
* @return true 是 false 否
81+
*/
82+
boolean isLeaf();
83+
84+
/**
85+
* 获取子节点
86+
*
87+
* @return element list
88+
*/
89+
<T extends Element> List<T> getChildren();
90+
91+
/**
92+
* 添加子结点
93+
*/
94+
<T extends Element> void addChildren(T element);
95+
96+
/**
97+
* 覆盖并设置子结点
98+
*
99+
* @param children children
100+
*/
101+
<T extends Element> void setChildren(List<T> children);
102+
103+
/**
104+
* 清除children数据
105+
*/
106+
void clearChildren();
107+
108+
/**
109+
* 访问器模式访问每一个节点。默认实现为深度优先原则
110+
*
111+
* @param visitor visitor
112+
*/
113+
default void accept(Visitor visitor) {
114+
accept(visitor, Traversal.NONE);
115+
}
116+
117+
/**
118+
* 访问器模式访问每一个节点。默认实现为深度优先原则
119+
*
120+
* @param visitor visitor
121+
* @param traversal 遍历原则
122+
*/
123+
void accept(Visitor visitor, Traversal traversal);
124+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package cc.allio.uno.core.datastructure.tree;
2+
3+
import java.io.Serializable;
4+
5+
/**
6+
* 树平展结点
7+
*
8+
* @author j.x
9+
* @date 2023/11/9 11:32
10+
* @since 1.1.5
11+
*/
12+
public interface Expand {
13+
14+
/**
15+
* 获取当前结点的标识
16+
*/
17+
Serializable getId();
18+
19+
/**
20+
* 获取父节点标识
21+
*/
22+
Serializable getParentId();
23+
}

uno-rule/src/main/java/cc/allio/uno/rule/api/vistor/NoneTraversalMode.java renamed to uno-core/src/main/java/cc/allio/uno/core/datastructure/tree/NoneTraversalMode.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package cc.allio.uno.rule.api.vistor;
1+
package cc.allio.uno.core.datastructure.tree;
22

33
/**
44
* 优先访问枝干
@@ -14,7 +14,7 @@ public class NoneTraversalMode implements TraversalMode {
1414
@Override
1515
public void doTraversal(TraversalElement e, Visitor visitor) {
1616
e.doAccept(visitor);
17-
e.getChildrens().forEach(c -> c.accept(visitor, getMode()));
17+
e.getChildren().forEach(c -> c.accept(visitor, getMode()));
1818
}
1919

2020
@Override

uno-rule/src/main/java/cc/allio/uno/rule/api/vistor/Traversal.java renamed to uno-core/src/main/java/cc/allio/uno/core/datastructure/tree/Traversal.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package cc.allio.uno.rule.api.vistor;
1+
package cc.allio.uno.core.datastructure.tree;
22

33
/**
44
* 规则树遍历方式

uno-rule/src/main/java/cc/allio/uno/rule/api/vistor/TraversalElement.java renamed to uno-core/src/main/java/cc/allio/uno/core/datastructure/tree/TraversalElement.java

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
package cc.allio.uno.rule.api.vistor;
2-
3-
import java.util.*;
1+
package cc.allio.uno.core.datastructure.tree;
42

53
/**
64
* 遍历元素原则实现.{@link Traversal}
@@ -16,13 +14,6 @@ public void accept(Visitor visitor, Traversal traversal) {
1614
TraversalMode.get(traversal).doTraversal(this, visitor);
1715
}
1816

19-
/**
20-
* 获取子节点
21-
*
22-
* @return element list
23-
*/
24-
protected abstract List<TraversalElement> getChildrens();
25-
2617
/**
2718
* 子类可以继承实现,默认调用访问访问当前元数据
2819
*

uno-rule/src/main/java/cc/allio/uno/rule/api/vistor/TraversalMode.java renamed to uno-core/src/main/java/cc/allio/uno/core/datastructure/tree/TraversalMode.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package cc.allio.uno.rule.api.vistor;
1+
package cc.allio.uno.core.datastructure.tree;
22

33
import cc.allio.uno.core.exception.Exceptions;
44

0 commit comments

Comments
 (0)