您所在的位置:QQ首页 > 动画频道 > 高级应用> 正文

AS2.0中实现数据结构-哈希表实现
http://flash.QQ.com   2006年 06月 29日 14:50   闪吧  
第 1 2

下一个更精彩:gotoAndPlay与gotoAndStop的之间

在游戏制作中我们经常需要存储一些离散的对象数据,比如道具箱里的道具,经常需要执行插入和删除操作,而且道具之间没有联系是无序排列的.有些人会说直接用数组不就得了,但是有大量数据存储时的数组的删除插入操作的效率是很低的。

因此我们需要哈希表这样的可以提供快速的插入和删除,查找操作的数据结构,不论哈希表中有多少数据,插入和删除操作只需要接近常量的时间:即O(1)的时间级。

既然这么好那么我们的AS可以实现吗?当然可以!AS发展到AS2.0,已经成为在语法上更接近于Java + Pascal的面向对象的语言.如今,伴随着Flash8的发行,使得这种脚本语言添加了运行速度更加快捷,后台技术连接的更加方便等优点.因此我们完全可以用AS来实现一些常用数据结构。

首先我们先要实现有序链表,顾名思义,链表就是一种像链一样的数据结构,类似数组,但是不同的是链表每个节点一般都至少包括一个数据项和一个指向下个节点的指针,而且有序链表的数据是按顺序排列的。

建议大家把类都放到包里,这样便于以后查找和使用,这里我把这些类放在名为util的包里面.

有序链表的实现:

链表结点类:

class util.Link

{

public var iData; // data item(key)

public var dData;

public var next:util.Link; // next link in list

// ------------------------------------------------------------

public function Link(id,dd) // constructor

{

iData = id; // (’next’ is automatically

dData = dd;

} // set to null)

// ------------------------------------------------------------

public function displayLink():Void // display ourself

{

trace("{" + iData + "," +dData+ "} ");

}

} // end class Link  

有序链表类:  

import util.Link;//注意要导入我们前边的Link类!

class util.SortedList

{

private var first:Link; // ref to first list item

// ------------------------------------------------------------

public function SortedList() // constructor

{ first = null; }

// ------------------------------------------------------------

public function insert(theLink:Link):Void // insert link, in order

{

var key = theLink.iData;

var previous:Link = null; // start at first

var current:Link = first;

// until end of list,

while(current != null && key > current.iData)

{ // or current > key,

previous = current;

current = current.next; // go to next item

}

if(previous==null) // if beginning of list,

first = theLink; // first --> new link

else // not at beginning,

previous.next = theLink; // prev --> new link

theLink.next = current; // new link --> current

} // end insert()

public function deleteD(key):Void // delete link

{ // (assumes non-emptylist)

var previous:Link = null; // start at first

var current:Link = first;

// until end of list,

while(current != null && key != current.iData)

{ // or key == current,

previous = current;

current = current.next; // go to next link

}

// disconnect link

if(previous==null) // if beginning of list

first = first.next; // delete first link

else // not at beginning

previous.next = current.next; // delete currentlink

} // end delete()

// ------------------------------------------------------------

public function find(key):Link // find link

{

var current:Link = first; // start at first

// until end of list,

while(current != null && current.iData <= key)

{ // or key too small,

if(current.iData == key) // is this the link?

return current; // found it, return link

current = current.next; // go to next item

}

return null; // didn’t find it

} // end find()

// ------------------------------------------------------------

public function displayList():Void

{

trace("List (first-->last): ");

var current:Link = first; // start at beginning of list

while(current != null) // until end of list,

{

current.displayLink(); // print data

current = current.next; // move to next link

}

trace("");

}

} // end class SortedList  

下一页
第 [1] [2]
免费订阅】【发表评论】【动画论坛】【  】【关闭
发表评论
 QQ号码:
 QQ密码:
 验证码: 匿名发表
* 请各位网友遵纪守法并注意语言文明。
*《互联网电子公告服务管理规定》
*《全国人大常委会关于维护互联网安全的规定》




关于腾讯 | About Tencent | 服务条款 | 广告服务 | 腾讯招聘 | 腾讯公益 | 客服中心 | 网站导航
Copyright © 1998 - 2008 Tencent Inc. All Rights Reserved
腾讯公司 版权所有