基本使用
首先导入库。
allprojects {
repositories {
...
maven { url 'https://jitpack.io'
}
}
}
dependencies {
implementation 'com.github.PYJTLK:MindMapViewTest:1.2'
}
为了快速上手树形存储器,我们以下面这张图片为例创造一棵树。
Tree<Integer> root = new Tree<>();
//设置树根结点的数据
root.setRootData(0);
root.insertChild(new Tree<Integer>(1));
root.insertChild(new Tree<Integer>(2));
//也可以直接在构造函数传值给根结点
Tree<Integer> subTree = new Tree<>(3);
subTree.insertChild(new Tree<Integer>(4));
subTree.insertChild(new Tree<Integer>(5));
root.insertChild(subTree);
Tree<Integer> subTree2 = new Tree<>(6);
subTree2.insertChild(new Tree<Integer>(7));
subTree2.insertChild(new Tree<Integer>(8));
subTree2.insertChild(new Tree<Integer>(9));
subTree.insertChild(subTree2);
从代码里可以看出每个结点都是一颗树。
常用方法
方法 | 说明 |
---|---|
insertChild | 插入一个子结点 |
insertChildren | 插入多个子结点 |
removeChildTree | 移除子结点 |
getChildren | 获取子结点数组 |
getRootData | 获取根结点数据 |
setRootData | 设置根结点数据 |
isLeaf | 是否为叶结点 |
dfs | 深度优先遍历 |
bfs | 广度优先遍历 |
parseFromXml | 从xml文件解析出树 |
进阶用法
1.dfs、bfs
只要传入一个NodeSearcher的实现类就可以在遍历各个结点的时候做我们想做的事了,这里以dfs为例。
root.dfs(new NodeSearcher<Integer>() {
@Override
public boolean onNode(Tree<Integer> parent, Tree<Integer> thisTree) {
Log.d(TAG, "onNode:" + thisTree.getRootData());
//1
return true;
}
});
注意代码1的返回值,如果返回false则会立即中断遍历,bfs也是一样的。
2.从xml文件中解析一颗树
首先写一个树的xml文件,还是以刚刚那棵树为例。
xml数据如下,tree中的data是指根结点的数据,node中的data是指叶结点的数据。
<tree data="0">
<node data="1"/>
<node data="2"/>
<tree data="3">
<node data="4"/>
<node data="5"/>
<tree data="6">
<node data="7"/>
<node data="8"/>
<node data="9"/>
</tree>
</tree>
</tree>
接下来调用 parseFromXml 方法就可以解析了,其中第一个参数是指xml文件的输入流,第二个参数是xml解析器。
Tree<Integer> tree = Tree.parseFromXml(is,new IntegerTreeXmlHandler());
我们读出来的xml原始数据是字符串,可以重写 AbsTreeXmlHandler 这个类来将原始数据转换为目标类型,来看看 IntegerTreeXmlHandler 的代码。
public class IntegerTreeXmlHandler extends AbsTreeXmlHandler<Integer> {
@Override
public Integer parseData(String sourceData) {
return Integer.parseInt(sourceData);
}
}
代码相当简单,就是将原始的字符串数据转换为整型数据,解析后就得到一个整型数据的树了。要转换为其他类型的数据也是一样的,这里提供了几种解析器。
StringTreeXmlHandler 字符串解析器
IntegerTreeXmlHandler 整型解析器
LongTreeXmlHandler 长整型解析器
FloatTreeXmlHandler 单精度浮点型解析器
DoubleTreeXmlHandler 双精度浮点型解析器
BooleanTreeXmlHandler 布尔型解析器
3.n叉树
n叉树和普通的树是有区别的,比如三叉树的分支树不能超过3。如果我们对分支有限制可以使用BranchTree。
Tree<String> root = new BranchTree<>("root",3);
root.insertChild(new BranchTree<String>("leaf0",3));
root.insertChild(new BranchTree<String>("leaf1",3));
root.insertChild(new BranchTree<String>("leaf2",3));
//此处会报错,因为超出三叉树的分支限制
root.insertChild(new BranchTree<String>("leaf3",3));
最后
以上就是树形存储器的使用方法,对源码感兴趣的朋友可以到Github项目看看。
下一篇讲解解析器的原理及代码优化。
文章评论