Android 树形存储器(一):使用方法

本文详细介绍了一种树形存储器的基本使用方法,包括如何创建树、插入和删除节点、遍历树等操作。同时,文章还介绍了如何从XML文件中解析树结构,并提供了多种数据类型的解析器。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基本使用

首先导入库。

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项目看看。

下一篇讲解解析器的原理及代码优化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值