使用Vector类编程

一个array(数组)就像是把一套变量组织在一起的容器。单个数组可以含有许多不同的值。你可以储存和取得数组中的单个值(也就是数组elements(元素))。你也可以通过直接操作数组变量来成组地使用其值。最常见的是有序数组。你可以凭某个索引号从中获取值。Action Script3包括了用于索引数组的两个类。

  • Array 类:一个可以包含各种值类型的索引数组,其包容度甚至可以允许你在同一个数组里混合各种值类型。
  • Vector类:也是索引数组。其元素必须都为同一个类的实例。Vector类适用于 Flash Player 10和之后的版本。

如果你需要存储一系列具有相同数据类型的值,与Array类相比,Vector类有一些优势。首先,因为Vector的所有元素要求必须有相同的数据类型,所以ActionScript编译器在代码编译的时候就可以进行类型检查。任意尝试添加或恢复错误类型值的代码都将被处理为编译时错误。数据类型在运行时也会进行检查,因此,假设数据类型不能再编译时被检查出来,它仍然会被检查,而且数据类型限制也还是有效的。除了类型检查的优点之外,使用Vector类的代码比使用Array创建的同样代码明显运行得要快— —这是一个重要的优势。

这篇快速入门描述了创建于使用Vector类的技巧。要了解更多关于Array类的使用,请参考Flash快速入门使用数组编程

以下段落描述了使用Vector对象的常用接下来的部分描述了用Vector对象完成一般任务:创建一个Vector实例,为一个Vector对象添加值,为一个Vector对象更改值,为一个Vector对象的值分类。

基本要求

要实现这篇快速入门中的实例,你需要如下实例文件:

示例文件

这个示例存档文件包含了如下几个文件:

  • SortVectorOfNumber.fla:一个Flash文件,演示了在Vector中对数字值进行排序,在本文中的"将一个Vector中的值进行排序"分段中进行描述。
  • SortVectorOfObject.fla:一个示例演示中Vector中对常用对象进行排序,在本文中的"将一个Vector中的值进行排序"分段中进行描述。
  • Person.as:Person类的源码,在SortVectorOfObject.fla中引用。

要测试每个应用,请打开FLA文件,并选择"控制 > 测试影片"。

预备知识

推荐有使用ActionScript3编程的一般经验。

创建一个Vector实例

一个Vector对象是一个只保存着某类值的索引数组。Vector对象特定保存的类是Vector的基本型。而调用Vector类的构造函数的时候就创建了一个Vector对象。你也许猜到了,制定给Vector变量的基本类必须匹配调用构造函数时指定的基本型。

当创建一个Vector实例的时候,为了指定它的基本型,你要在Vector类名字上增加额外的信息, 使用一个叫做类型参数的语法格式。比如,下面的表述声明了一个叫做myVector的Vector变量,使用类型参数语法来指出在myVector里的 Vector只能包含字符串类型的值。

var myVector:Vector.<String>;

当你调用Vector构造函数来实际创建Vector对象的时候可以用一样的语法:

myVector = new Vector.<String>();

作为一种规则,只要有Vector这个类名出现在你的代码里,你总是要对它使用一个类型参数。

当然,你可以把变量声明和构造实例整合到一行代码里。

var myVector:Vector.<String> = new Vector.<String>();

尽管在这篇快速入门中所给的示例都比较简单,例如创建String和Number作为Vector的基类型,实际上,Vector类的基类型可以是任何类。这也包括你定义的自定义类。例如,假设你的代码定义了一个名为MyClass的类。在这种情况下,下面的代码是有效的,它将创建一个Vector对象,它的元素都必须是MyClass实例:

var v:Vector.<MyClass> = new Vector.<MyClass>();

预设Vector的长度

Vector类构造函数有两个可选参数,它允许你明确你的Vector实例的数量。第一个参数是length参数。默认情况下,当一个Vector被创建时,它是空的(它有0个元素)。然而,如果你传递一个值给length参数,明确元素数量的Vector实例就被创建了:

var myVector:Vector.<String> = new Vector.<String>(7); // myVector is created with 7 elements

预先确定Vector的大小比一次创建一个元素效率要高,所以,如果你提前知道Vector包含有多少元素,提供一个length参数值是比较好的。如果Vector的基类型是一个Boolean或者一个数值类型(Number,int,uint),每个元素都会被赋予这个数据类型的默认值(Boolean的默认值false,数据类型默认值0)。否则,每个元素初始值为null

创建一个可动态调整长度的Vector

Vector对象的另一个特征就是他们可以调整长度,这意味着你可以改变值,但是不能通过添加或删除元素来改变总数。默认地,一个Vector实例是不允许动态修改长度的。要创建一个可修改长度的Vector,将Vector类构造函数的第二个参数(fixed参数)设置为true

var myVector:Vector.<String> = new Vector.<String>(7, true); // myVector's length is fixed to 7 elements

注意: 你可以在任何时候修改Vector对象的fixed属性来设置Vector的长度是否可变。

myVector.fixed = false; // myVector's length is no longer fixed

为一个Vector对象添加值

除了一个额外的限制之外,添加一个值到Vector对象中与添加一个值到Array对象中类似。一个Vector对象的每个元素必须有一个值(或者null)。换句话说,你不能在一个序号为4的位置添加一个值,除非Vector的0–3为已经有值了。在实际中,这意味着要添加一个新的元素到Vector中,你必须在等于Vector对象长度的序号位置添加它(因为Vector的第一个元素序号为0,所以length属性的值通常比Vector最后一个元素的序号要大)。下面的代码演示了这一技巧:

var names:Vector.<String> = new Vector.<String>();

// ... assume some elements are added ...

// Add an element to the end of the Vector
names[names.length] = "Bob";

除了使用array访问符([])操作添加一个值到Vector对象中外,你也可以使用Vector对象的push()或者unshift()方法来添加元素到Vector中。就像Array类一样,push()方法创建了一个新元素在Vector最后一个元素的末尾,unshift()方法创建了一个新元素在Vector序号为0的位置(同时将所有已经存在的元素移位值高一位的位置):

names.push("Harold"); // adds the value "Harold" to the end of the Vector
names.unshift("Fred"); // adds the value "Fred" to the start of the Vector

这些方法还有额外的优势是,你可以传递多个值做为参数给方法,所有的值都会一次性添加到Vector对象中。然后,这种弹性的方式也会导致一个后果。当你使用push()或者unshift()方法添加值到Vector对象时,编译器不能检查数据类型是否匹配。因为,任何使用push()或者unshift()添加错误类型的值到Vector对象中的代码知道运行代码时才会被发现。

从Vector对象中恢复值

从Vector对象中恢复值与从一个Array对象中恢复值完全一样。要从特定序号位置回复元素值,你需要使用数组访问符([])操作来明确你需要的元素序号:

var name1:String = names[0];

使用数组访问符([])操作恢复值,但是不会将它从Vector对象中移除。要恢复值并且将它从Vector对象中移除,请使用pop()方法(它会移除最后的一个元素)或者shift()方法(它会移除第0个元素,并且所有元素减一位):

var finalName:String = names.pop(); // removes the last value from the Vector
var firstName:String = names.shift(); // removes the first value from the Vector

将一个Vector中的值进行排序

大部分使用Vector对象的方法与使用Array对象的方法都一样。有一个方法你需要知道的不一样的是在Vector对象元素排序。Vector类仅有一个方法给值排序:sort()方法。sort()方法不会更改原始的Vector对象。取而代之,它返回具有相同基类型包含已排序了值的一个新的Vector。

当你使用Vector类的sort()方法时,它没有默认的排序行为,即使是基本的数据类型如Number或者String。正因为如此,任何时候你使用sort()方法,你都需要指明一个自定义的排序函数来定义排序逻辑。例如,下面的代码中,一个Number类型的Vector对象使用sort()方法来排序。在这个案例中,这个代码演示了基本的数据排序;小的数字放在大的数字前面(升序排列)。名为sortNumbers()的函数定义了排序行为,它做为一个参数传递给了sort()方法调用。Flash Player给每个数字排序时,它调用sortNumber()函数,将要进行比较的两个数值传递给函数,结果决定最终排序的顺序:

var numberVector:Vector.<Number> = new Vector.<Number>();
numberVector.push(2, 17, 3.6, 4.4, 29, -34, 0.09235); trace(numberVector); // output: 2,17,3.6,4.4,29,-34,0.09235 var sortedVector:Vector.<Number> = numberVector.sort(sortNumbers); trace(sortedVector); // output: -34,0.09235,2,3.6,4.4,17,29 function sortNumbers(x:Number, y:Number):Number
{
if (x < y)
{
return -1;
}
else if (x > y)
{
return 1;
}
else
{
return 0;
}
}

你可以定义为任意数据类型定义一个排序函数。例如,下面的代码为Vector的Person对象根据姓氏(last name)进行了排序,然后是名字(first name)(它假定了有一个Person类具有firstNamelastName属性):

var personVector:Vector.<Person> = new Vector.<Person>();
personVector[0] = new Person("Bob", "Smith");
personVector[1] = new Person("Harold", "Johnson");
personVector[2] = new Person("Barbara", "Smith");
personVector[3] = new Person("Arnold", "Anderson");
personVector[4] = new Person("Margaret", "Wooster"); // output:[Smith,Bob],[Johnson,Harold],[Smith,Barbara],[Anderson,Arnold],[Wooster,Margaret]
trace(personVector); var sortedVector:Vector.<Person> = personVector.sort(sortPeople); // output:[Anderson,Arnold],[Johnson,Harold],[Smith,Barbara],[Smith,Bob],[Wooster,Margaret]
trace(sortedVector); function sortPeople(x:Person, y:Person):Number
{
// sort by last name
var lastNameSort:Number = sortStrings(x.lastName, y.lastName);
if (lastNameSort != 0)
{
return lastNameSort;
}
else
{
// if the last names are identical, sort by first name
return sortStrings(x.firstName, y.firstName);
}
} function sortStrings(x:String, y:String):Number
{
if (x < y)
{
return -1;
}
else if (x > y)
{
return 1;
}
else
{
return 0;
}
}

AS3.0 Vector的运用的更多相关文章

  1. “AS3.0高级动画编程”学习:第一章高级碰撞检测

    AdvancED ActionScript 3.0 Animation 是Keith Peters大师继"Make Things Move"之后的又一力作,网上已经有中文翻译版本了 ...

  2. [ActionScript 3.0] AS3.0和AS2.0的相互通信

    AS3和AS2之间的通信,最好的方式可能就是LocalConnection了. AS2向AS3发送数据,即AS2调用AS3的函数: as2.0代码(按钮上写的发送信息代码): on (release) ...

  3. 转载:Flash AS3.0 加载外部资源(图片,MP3,SWF)的两种方式

    Flash AS3.0 加载外部资源(图片,MP3,SWF)的两种方式 出自:http://www.cnblogs.com/top5/archive/2012/08/04/2623464.html 关 ...

  4. as3.0 interface接口使用方法

    [转]as3.0 interface接口使用方法 AS在2.0的时候就支持接口了 接口能够让你的程序更具扩展性和灵活性,打个例如 比方你定义了一个方法 代码: public function aMet ...

  5. AS3.0定义变量的访问范围

    在AS3.0中变量的默认访问范围是:internal:包内成员可以访问,包外不可访问.AS2.0默认访问范围是public

  6. AS3.0函数定义的方法

    在AS3.0中函数的定义有两种方法: 函数语句定义法: function 函数名(参数1:参数类型,参数2:参数类型):返回值类型{ 函数折行的语句 } function testAdd(a:int, ...

  7. AS3.0下去除flash右键菜单

    这两天工作中遇到一个问题,就是网页中内嵌的flash小游戏的用户体验,当鼠标在flash上点击右键时,出现的右键菜单中会有播放,停止等选项,虽然不会造成什么漏洞,但是体验非常差.在寻找解决方案的时候, ...

  8. As3.0 类的【枚举】

    As3.0 类的枚举   “枚举”是您创建的一些自定义数据类型,用于封装一小组值.ActionScript 3.0 并不支持具体的枚举工具,这与 C++ 使用 enum 关键字或 Java 使用 En ...

  9. Java&&As3.0 中的final 关键字

    Java和AS3.0关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类.非抽象类成员方法和变量.你可能出于两种理解而需要阻止改变:设计或效率.   可以修饰的对象:   fin ...

随机推荐

  1. 运输层和TCP/IP协议

    0. 基本要点 运输层是为相互通信的应用进程提供逻辑通信. 端口和套接字的意义 什么是无连接UDP 什么是面向连接的TCP 在不可靠的网络上实现可靠传输的工作原理,停止等待协议和ARQ协议 TCP的滑 ...

  2. 微信小程序实现图片上传,预览,删除

    wxml: <view class='imgBox'> <image class='imgList' wx:for="{{imgs}}" wx:for-item= ...

  3. 创建.dat文件(转载)

    比较有用的东比较有用的东西 首先,批处理文件是一个文本文件,这个文件的每一行都是一条DOS命令(大部分时候就好象我们在DOS提示符下执行的命令行一样),你可以使用DOS下的Edit或者Windows的 ...

  4. Leetcode 之Longest Common Prefix(34)

    这题实现起来还是挺麻烦的,就偷懒使用下库函数strtod().第二个参数表示字符中不是数字的地方,如果后面是空格,则认为其仍是数字,否则不是. bool isNumber(char *s) { cha ...

  5. U43597 积木

    题目背景 小 XX 感到很无聊,从柜里翻出了小时候玩的积木. 题目描述 这套积木里共有 \(n\) 块,每块积木都是一个长方体. 小 X 想知道这些积木拼成一个积木塔(不必每一块 积木都使用). 所谓 ...

  6. java获取项目路径,url路径

    我的web项目名iamgeModel. 工作空间在D盘 先获取url相关: 需要是HttpServletRequest request; 获取IP: request.getServerName() / ...

  7. ajax登录请求,无法跳转

    没有用form提交数据,用的ajax提交.服务器显示已经登录成功,并且返回了成功代码OK.却无法进行跳转: js代码: $("input[type='submit']").on(& ...

  8. 【python】时间戳、字典列表排序

    记录一下昨天学到的知识: 一.文件相关 文件追加:f = open("fname","a")    文件不存在时创建 二.时间戳相关 http://www.jb ...

  9. Mybatis学习—XML映射文件

    总结自 Mybatis官方中文文档 Mapper XML 文件 MyBatis 的真正强大在于它的映射语句,也是它的魔力所在.由于它的异常强大,映射器的 XML 文件就显得相对简单.如果拿它跟具有相同 ...

  10. h5游戏制作

    前言: 好久没更新博客了,以前很多都不会,所以常常写博客总结,倒是现在有点点经验了就懒了.在过去的几个月里,在canvas游戏框架方面,撸过了CreateJS,玩得了Egret,又学过PIXI.js. ...