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

基本使用

首先导入库。

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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现Android端的简易思维导图。可以保存数据。编辑树形图。建立模型主要模型结构相对简单:TreeModel,NoteModel,NoteView,TreeView。核心实现分布如下:2017-07-01TreeModel:树形结构的存储,树形结构的遍历,添加、删除节点;NoteModel:节点关联的指向,和Parent的指向;TreeView :绘制树形结构,对树形结构位置的纠正,实现View层的添加,删除,note关联绘制;NoteView:显示text;编写位置计算核心代码在核心代码中,我想和大家分享的是TreeView如何对多种Style(树形形状)进行适配的问题。因为我们的树形结构的表达多种的,有的是一个半树形图,有点是圆形展开的等。对于这个问题,作为程序员如何进行解耦能,采用Interface进行解构适配,统一行为。所以在这里我写了一个TreeLayoutManager进行管理树形的位置表达。这里我实现了一个RightTreeLayoutManager。代码概况如下:接口public interface TreeLayoutManager {     /**      * 进行树形结构的位置计算      */     void onTreeLayout(TreeView treeView);     /**      * 位置分布好后的回调,用于确认ViewGroup的大小      */     ViewBox onTreeLayoutCallBack();     /**      * 修正位置      *      * @param treeView      * @param next      */     void correctLayout(TreeView treeView, NodeView next); }实现public class RightTreeLayoutManager implements TreeLayoutManager{     final int msg_standard_layout = 1;     final int msg_correct_layout = 2;     final int msg_box_call_back = 3;     private ViewBox mViewBox;     private int mDy;     private int mDx;     private int mHeight;     public RightTreeLayoutManager(int dx, int dy, int height) {         mViewBox = new ViewBox();         this.mDx = dx;         this.mDy = dy;         this.mHeight = height;     }     @Override     public void onTreeLayout(final TreeView treeView) {         final TreeModel mTreeModel = treeView.getTreeModel();         if (mTreeModel != null) {             View rootView = treeView.findNodeViewFromNodeModel(mTreeModel.getRootNode());             if (rootView != null) {                 rootTreeViewLayout((NodeView) rootView);             }             mTreeModel.addForTreeItem(new ForTreeItem<NodeModel>() {                 @Override                 public void next(int msg, NodeModel next) {                     doNext(msg, next, treeView);                 }             });             //基本布局             mTreeModel.ergodicTreeInWith(msg_standard_layout);   

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值