[转][新闻资讯] [Flash/Flex] Adobe 荐文:用Vector类编程

http://bbs.9ria.com/thread-70725-1-1.html


本帖最后由 chocoZero 于 2010-12-20 17:28 编辑


所需条件:
必备知识:推荐有使用ActionScript3编程的一般经验
用户水平:初学者
所需产品:Flash Professional(下载试用版)
样例文件:programming_with_vector.zip

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

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

如果你需要储存一个所有数据类型都相同的值集合。那Vector类比Array类好些。首先,因为Vector里的所有元素必须具有相同的数据类型,当代码被编译的时候,Action Scritpt编译器会检查数据类型。任何试图增加或改变成错误类型值的代码都会在编译期被捕获。数据类型也会在实时运行时被查到。所以万一数据类型没在编译时被查过,它仍然会检查并且类型限制依旧严格。类型检查的好处之外,采用Vector类的代码运行明显快过相同条件下采用Array类的代码,这可是值得注意的好处。

这篇快速入门描述了创建并使用Vector类的技术。要了解更多Array类相关知识,看看:用Array类编程(中文版(wuyanna翻译))。接下来的部分描述了用Vector对象完成一般任务:创建一个Vector实例,为一个Vector对象添加值,为一个Vector对象更改值,为一个Vector对象的值分类。

创建一个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的基本型可以是任何类。包括你自己的自定义类。比如,假设你定义了一个名叫MyClass的类。这种情况下,以下代码是可行的,它会创建一个元素统统为MyClass实例的Vector对象。
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 creat
复制代码
预设Vector的规模快过一个个地添加元素进去。所以如果你预先知道一个Vector含有多少个元素,最好就提供一个length参数,如果Vector基本型是布尔或者某个数值型(Number,int,uint),每个元素都被赋予该类型的默认值(布尔型是false,数值型为0)。其他情况下,每个元素初始值为null。

创建一个固定长度的Vector
Vector对象的另一个特点就是可以固定长度,这意味着你可以改变值,但不能通过增加或删除值来改变值的总个数。一个Vector实例默认是非固定长度的。为了创建一个固定长度的Vector,须指定true值给Vector类构造函数的第二参数(fixed参数)。
var myVector:Vector.<String> = new Vector.<String>(7, true); // myVector's length is fixed to 7 elements
复制代码
注意:你可以在任何时候修改这个fixed参数的值,对长度进行限定或取消限定。
myVector.fixed = false; // myVector's length is no longer fixe
复制代码
为一个Vector对象添加值

除了多了一个限制之外,为Vector对象添加值和Array对象是差不多的。Vector对象的所有元素都必须有值(或null)。换句话说,你不能在0-3号元素的值缺失的情况下给第4位置上的元素添加值。实践中,这就意味着在给一个Vector添加一个新元素的时候,你必须以Vector对象现有的length属性为基础来确定新元素的位置(因为一个Vector的第一个元素的序号为0,length属性总是比最后一个元素的序号大1)。下面的代码展示了这个技巧:
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";
复制代码
除了用数组操作符([])之外,你也可以使用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对象里删除之。若既要取得值又要删除之的话,使用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给这些数字排序的时候,它会调用sortNumbers()函数,传递进两个要比较的数字,而结果决定了最终排序:
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; } }
复制代码
你可以为任何数据类型定义排序函数。比如,下面的代码给一个Person型的Vector对象排序,先是按姓,然后是按名(它假设有这么个具有姓和名两个属性的Person类。)
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; }
}
复制代码
样例文件的使用

你可以从页顶下载样例文件,programming_with_vector.zip。其中包含了以下文件:
•              SortVectorOfNumber.fla 和 SortVectorOfNumber_CS5.fla (Flash CS5 版本): 一个Flash Professional文件。展示了这篇文章里所说的“在一个Vector实例里给值排序”。
•        SortVectorOfObject.fla and SortVectorOfObject_CS5.fla (Flash CS5 版本): 展示了在Vector里给自定义对象的排序,如文章里描述的“在一个Vector实例里给值排序”。
•        Person.as:Person类的源代码,引用自SortVectorOfObject.fla。
要测试每个应用,须打开该FLA文件并选择Control > Test Movie。

从这里出发

你可以在ActionScript 3.0 Reference for the Adobe Flash Platform的以下条目里找到Vector类的所有详情。
Vector类
Vector.<T>()转换函数

你可能感兴趣的:(编程,Flex,Flash,资讯,Adobe)