AS3的数据结构知识(参考Nshen的文章)
2014-01-08 13:27
253 查看
http://www.nshen.net/dataStructure/2011/08/25/AS3-DataStructure.html
上面是nshen原文的链接,由于本人是软件工程软件维护方向,所以最近关注一下代码的积累与重用,同时也是为了以后正式走向开发岗位做些练习,可以将nshen总结的数据结构直接积攒起来以后重用:),我读了这篇文章,感觉写的很好,尤其是其中对游戏sprite的四叉树碰撞检测,这个在我当年直研考试曾经弄过一把四叉树,所以感觉很实用。下面是基于这篇文章做些个人的修改。
首先双向链表部分的get()方法,由于是双向链表,那么在遍历的时候就有正向遍历和反向遍历之分,在获取某个位置的元素时,如果该元素的index在链表的前一半,用正向遍历效率较高,后一半用反向遍历,所以我修改了get()方法如下。当然在链表很大的时候这样分别遍历效率会提高很多,如果链表较小则无所谓了
另外nshen的代码中将tree转化成xml的时候,有个toXML方法,之前代码如下(我做过一点修改,下面会说)
nshen提出了求好方法,于是我就献丑下。
发现其实那个方法是用栈来实现递归,由于xml文件的特殊性(需要一对标签),所以非递归的实现方式逻辑上就复杂了点,要将 入栈还要判断出栈的是否为字符串,于是我实现了个递归的方式。用栈实现非递归因为栈的后进先出特性,所以用的逆向遍历以达到和构建的树一样的节点顺序,用递归我就改成了正向遍历,关于字符串的+=和concat()的效率问题,我暂时假定的是不考虑+=效率是否低下。
所以说递归用在树形遍历真是舒服:)
另外nshen中toxml方法有个参数,感觉不太舒服,于是我修改成了参数默认值为null,如果默认值为null,下面用if(Node == null)Node = this;判断改成this。这样如果只是想将树的某棵子树toxml就传参好了,否则就像调用toString()一样直接调用,默认将本实例toxml。
我用递归实现的toxml方法如下:
代码改的匆匆,跑了下nshen的测试用例,发现没错误就没有再检查,如果有程序有其他错误请联系我:)
上面是nshen原文的链接,由于本人是软件工程软件维护方向,所以最近关注一下代码的积累与重用,同时也是为了以后正式走向开发岗位做些练习,可以将nshen总结的数据结构直接积攒起来以后重用:),我读了这篇文章,感觉写的很好,尤其是其中对游戏sprite的四叉树碰撞检测,这个在我当年直研考试曾经弄过一把四叉树,所以感觉很实用。下面是基于这篇文章做些个人的修改。
首先双向链表部分的get()方法,由于是双向链表,那么在遍历的时候就有正向遍历和反向遍历之分,在获取某个位置的元素时,如果该元素的index在链表的前一半,用正向遍历效率较高,后一半用反向遍历,所以我修改了get()方法如下。当然在链表很大的时候这样分别遍历效率会提高很多,如果链表较小则无所谓了
public function get(Index:uint):* { if(this._length <=0 || Index<0 || Index>this._length-1){ return null; } var n:DListNode; /** *优化了一下,根据index为前一半还是 *后一半选择正向遍历还是反向遍历 **/ if(Index <= _length/2){ n = this.head; var i:uint = 0; while(i<Index) { i++; n=n.next; } }else { n = this.tail; var i:uint = _length-1; while(i > Index) { i--; n=n.prev; } } return n.data; }
另外nshen的代码中将tree转化成xml的时候,有个toXML方法,之前代码如下(我做过一点修改,下面会说)
/** * 输出xml能直接赋值给Flex的Tree组件的dataProvider属性 * * 这段代码谁能看懂我服他,我自己都看不太懂,有好方法记得通知我。。。 */ public function toXML(Node:Tree = null):XML { var xmlStack:Array=[ ]; if(Node == null)Node = this; var stack:Array = [Node]; var s:String = ""; while(stack.length>0) { var t:* = stack.pop(); if(t is String) { s+=t; }else { t = Tree(t); s+="<node label='"+t.data+"'>"; if(t.children.length>0) { stack.push("</node>"); }else { s+="</node>"; } var itr:DListIterator = t.children.getIterator(); itr.end(); while(itr.hasPrev()) { stack.push(Tree(itr.node.data)) itr.prev(); } } } return new XML(s); }
nshen提出了求好方法,于是我就献丑下。
发现其实那个方法是用栈来实现递归,由于xml文件的特殊性(需要一对标签),所以非递归的实现方式逻辑上就复杂了点,要将 入栈还要判断出栈的是否为字符串,于是我实现了个递归的方式。用栈实现非递归因为栈的后进先出特性,所以用的逆向遍历以达到和构建的树一样的节点顺序,用递归我就改成了正向遍历,关于字符串的+=和concat()的效率问题,我暂时假定的是不考虑+=效率是否低下。
所以说递归用在树形遍历真是舒服:)
另外nshen中toxml方法有个参数,感觉不太舒服,于是我修改成了参数默认值为null,如果默认值为null,下面用if(Node == null)Node = this;判断改成this。这样如果只是想将树的某棵子树toxml就传参好了,否则就像调用toString()一样直接调用,默认将本实例toxml。
我用递归实现的toxml方法如下:
public function toXML2():XML { var s:String = ""; s = genXML(this); return new XML(s); } protected function genXML(t:Tree):String { var s:String = ""; s += "<node label='"+t.data+"'>"; var itr:DListIterator = t.children.getIterator(); itr.start(); while(itr.hasNext()) { s+=genXML(Tree(itr.node.data)); itr.next(); } s += "</node>"; return s; }
代码改的匆匆,跑了下nshen的测试用例,发现没错误就没有再检查,如果有程序有其他错误请联系我:)
相关文章推荐
- JAVA基础知识之网络编程——-关于阻塞IO/非阻塞IO/同步IO/异步IO的一些参考文章
- 常用数据结构几篇好的参考文章
- Rxjava知识小结(附参考文章)
- 有关ASP.NET MVC Model Binding知识的文章
- 西安集训第六天-----一般的数据结构知识
- MFC库参考 - WinInet基础知识
- 引用别人的文章:整理出来的一些Android基础知识
- [综合面试] 牛人整理分享的面试知识:操作系统、计算机网络、设计模式、Linux编程,数据结构总结
- 《数据结构》(c++版)预备知识
- D3D实现骨骼动画参考文章
- java ArrayList源码分析参考文章
- 页面变灰。参考文章
- 引用一篇介绍游标等知识的文章, 特别详细
- 对照《C#数据结构》、《大话数据结构》、《数据结构算法与应用c++语言》学习数据结构知识
- Java基础知识强化之集合框架笔记72:集合特点和数据结构总结
- smack 参考文章
- 好久没发表文章了,来篇iOS开发知识整理!
- 数据结构-文章编辑
- TCP/IP 和 HTTP不了解?看完这篇文章,网络知识就全懂了
- 【AS3代码】数组知识