使用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类具有firstName
和lastName
属性):
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提供了Array和Vector两种内置数据结构,可以灵活选择适合的地图数据存储方案。 4. **图像加载和位图处理**:地图可能由多张图片拼接而成,需要使用Loader类加载图片并进行合并。位图数据可以使用BitmapData类...
AS3.0中文版API是ActionScript 3.0的官方中文文档,是开发者学习和使用Flex框架不可或缺的参考资料。ActionScript 3.0是一种基于ECMAScript规范的编程语言,主要用于开发Adobe Flash Player和Adobe AIR平台上的交互...
在AS3.0中,我们可以使用Vector类来进行向量运算。 向量法在模拟鸟飞动画中的应用主要体现在以下几个方面: 1. **速度和加速度**:鸟的飞行速度可以表示为一个向量,包括水平和垂直两个分量。同样,加速度也是一个...
【标题】"纯代码拼图as3.0" 指的是一个使用ActionScript 3.0编程语言实现的九宫格拼图游戏。ActionScript是Adobe Flash平台上的主要脚本语言,主要用于创建交互式内容、动画以及网页应用程序。AS3.0是该语言的一个...
《经典范例拼图游戏(as3.0)》是一款基于ActionScript 3.0开发的互动游戏,旨在提供一个有趣且具有挑战性的拼图体验。ActionScript 3.0是Adobe Flash Platform的主要编程语言,它在性能、类型检查和编程模型上都有...
5. **forEach方法**:在ActionScript 3.0中,数组和Vector类提供了forEach方法,可以用来遍历数组的每一项,但不支持break或continue语句。例如: ```actionscript var arr:Array = ["a", "b", "c"]; arr.forEach...
在探讨“Flash AS3.0代码优化”这一主题时,我们深入分析了如何提升Flash应用程序的性能,确保其运行更加流畅、高效。以下是从给定文件的标题、描述、标签和部分内容中提炼出的关键知识点: ### 1. DisplayObject ...
- **基础知识**:ActionScript 3.0(AS3)是一种强大的面向对象编程语言,主要用于Adobe Flash Player和Adobe AIR环境中开发交互式内容、应用程序和游戏。AS3支持事件处理机制、动态类型、内存管理等特性,并提供了...
1. 类和对象:AS3.0引入了严格的类定义和对象实例化,支持类继承、封装和多态性。例如,DisplayObject类是所有舞台上可视元素的基类,而EventDispatcher类处理事件分发。 2. 动画和时间轴控制:TimelineControl类...
1. 数组类型:AS3.0 有两种数组类型,动态数组 `Array` 和固定大小的 `Vector`。动态数组可以随时添加和删除元素,而固定大小的向量提供了额外的性能优化。 2. 数组方法:包括 `push()`, `pop()`, `shift()`, `...
asvector工具类
这是Opencv-3.0的支持向量机(SVM)的参考手册。
- **更好的类库支持**:AS3 引入了更为完整的类库,如 `Vector` 类、`Map` 类等,方便进行复杂的数据结构操作。 - **增强的安全性**:AS3 改进了沙盒安全机制,提高了应用的安全性。 #### 四、实例分析 下面通过一...
### AS3实现InfinityGridView #### 一、问题背景与发现 在进行UI界面优化的过程中,开发者注意到一个关键问题——UI加载速度过慢。这在仅包含显示逻辑的任务界面尤为明显,因为这类界面几乎不涉及复杂的网络请求或...
5. **ActionScript 3.0的库类**:包括Vector.、Date、Math、XML、JSON等,提供了一系列内置功能,方便开发者处理数据、时间和日期、数学运算以及与服务器的数据交换。 6. **错误处理**:AS3使用try-catch-finally...
AS3中的`Object`或自定义类可以用来表示物品属性,而`Array`或`Vector`用于组织和管理物品。 5. **碰撞检测**:在物品拖放时,需要判断目标位置是否可用。AS3提供了一些基本的几何运算,可以实现简单的碰撞检测。 ...
【AS3.0面试知识点详解】 AS3.0(ActionScript 3.0)是Adobe Flash平台的主要编程语言,用于创建交互式动画、游戏、应用程序等。以下是对AS3.0相关面试题目的深入解析: 1. **查找类实例中的嵌套实例** 在AS3.0中...
转向行为的实现依赖于向量数学,尤其是2D向量(Vector2D)。向量在转向行为中扮演着关键角色,它描述了方向和大小,可用于表示速度、加速度或位置关系。例如,一个角色的速度向量包含了移动方向和速度大小的信息。 ...
- **复合数据类型**:如 `Array`、`Object`、`Vector` 等。 - 例如,`var myArray:Array = new Array("apple", "banana");` 创建了一个数组。 - **处理对象**: - **属性**:对象的特征或状态,可以通过对象名来...
在ActionScript 3.0(AS3.0)中,自定义鼠标手势是一种增强用户交互体验的方法。通过监听鼠标移动和点击事件,开发者可以创建一套独特的控制方式,让用户通过简单的鼠标动作执行特定的操作。以下是对这个主题的详细...