首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > 移动开发 >

AS3.0 Vector的施用

2012-07-31 
AS3.0 Vector的运用使用Vector类编程一个array(数组)就像是把一套变量组织在一起的容器。单个数组可以含有

AS3.0 Vector的运用
使用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对象的值分类。

基本要求

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

    这些方法还有额外的优势是,你可以传递多个值做为参数给方法,所有的值都会一次性添加到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 Vectorvar 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;    }}

    <script type="text/javascript"></script>

热点排行