ActionScript3(AS3)类库学习之(二)——掌握Array和Vector数组操作
Array和Vector是AS3中两个重要的类,这两个类都用来表示数组,它们有很多相同之处,有很多相同的方法,但是,它们也有很多不同之处,主要是如下几点:
1.Array中可以存放多种不同类型的对象,number,String,甚至是更复杂的对象和数组。而Vector虽然也可以用来放各种类型的对象,但是在进行构造的时候就必须指定容纳的数据类型,指定之后就不能进行更改了,一个Vector对象只能放一种数据类型的对象。如果要添加或检索的对象的数据类型与 Vector 的基本类型不匹配,则会发生错误。
2.Array是一种松散的数组,即它可以index 0和index 5有值,但是之间没有值。而Vector是一种密集数组,每个索引位置都必须有值。有值是指某索引处不能是undefined的。
3.Array的操作更随意,它可以随意访问一个并不存在的索引进行赋值,而Vector有严格的越界检查。
这些区别使得Array具有更大的灵活性,而Vector则是更加安全,高效。所以在可以用Vector的情况下尽量用Vector来实现。
另外有一种特殊的关联数组,可以用Object进行创建,它更像是个Object,而且adobe并不推荐使用这种数组,所以就让我们无视它吧
下面来详细的介绍两种数组并进行比较:
一.创建数组
Array可以通过构造函数传递长度或组内对象来创建数组,也可以利用中括号赋值来创建.且组内对象可以是不同的类型.
var arr1:Array = new Array(); trace(arr1); var arr2:Array = new Array(5); trace(arr2); var arr3:Array = new Array("a", 3, "b"); trace(arr3); var arr4:Array = []; trace(arr4); var arr5:Array = ["a", 3, "b"]; trace(arr5);
Vector可以通过构造函数传递长度或组内对象来创建数组,也可以利用中括号赋值来创建.还可以通过全局函数来创建,当用全局函数进行创建时,会将Array转换为Vector,且将Array中每个对象都转换为Vector指定的类型.每种创建方法都必须指定数据类型.
var vec1:Vector.<int> = new Vector.<int>(); trace(vec1); var vec2:Vector.<int> = new Vector.<int>(5); trace(vec2); trace(vec2.fixed); var vec3:Vector.<int> = new Vector.<int>(5,true); //固定vector的长度为5 trace(vec3.fixed); var vec4:Vector.<int> = new <int>[0,1,2]; trace(vec4); var vec5:Vector.<int> = Vector.<int>([0, 1, 2]); trace(vec5); var arr:Array = [0, 1, "string"]; var vec6:Vector.<int> = Vector.<int>(arr); trace(vec6);
二.查找操作
Array和Vector都支持用===(类型和值都相等)来比较查找函数indexOf、lastIndexOf.具体用法如下:
indexOf(element):返回元素的索引值,不存在返回-1;
indexOf(element,index):从第index(从左到右数起)个元素开始查找,返回元素的索引值,不存在返回-1;
lastIndexOf(element):从右到左查找,返回元素的索引值,不存在返回-1;
lastIndexOf(element,index):从右到左,从第index(从左到右数起)个元素开始查找,返回元素的索引值,不存在返回-1;
三.增删操作
Array和Vector都支持push,pop,shift,unshift操作。当Vector为固定长度时,不能进行元素的增删操作。
push将一个或多个元素插入数组尾部。
pop从数组尾部移出一个元素
shift将一个或多个元素插入数组头部。
unshift从数组头部移出一个元素
另外Array和Vector还都能通过[]操作符,来增加元素。但是Array可以将元素增加在任意索引上,且将数组的长度变为存在的最大的index+1,而Vector只能连续的增加,索引值超出长度范围会报错。看下面的例子:
var arr:Array = [0, 1, 2]; arr[5] = 5; trace(arr); var vec:Vector.<int> = Vector.<int>([0, 1, 2]); vec[3] = 3; vec[5] = 5;//error trace(vec);
四.数组的组合和截取
Array和Vector都支持concat,splice,slice,join等操作来生成新的数组,或是字符串。
concat:将多个元素或者数组合并成新的数组
splice:删除数组指定索引后的所有或指定个数的元素(可以为0,也就是不删除),并可以选择插入多个新元素。将删除的元素作为新数组返回。这个操作会改变原数组,所以当Vector长度固定时不能进行该操作。
slice:获取数组的起点索引和终点索引(不包括)间的元素,并以数组的形式返回。
join:将数组中的元素转换为字符串、在元素间插入指定的分隔符、连接这些元素然后返回结果字符串。嵌套数组总是以逗号 (,) 分隔,而不使用传递给 join() 方法的分隔符分隔。
另外Array和Vector还都支持通过设置Length来截取数组,比如arr.Length=0;将清空数组。但是当Vector长度固定时不能执行该操作。
五.改变数组元素的位置
Array和Vector都支持reverse,sort,sortOn等
reverse:反转数组顺序,在改变原数组的同时,返回指向原数组的引用。
var letter1:Array = new Array("a", "b", "c"); var letter2:Array = letter1.reverse(); letter2[2] = "modified"; trace(letter1); trace(letter2);
sort:用不稳定的排序算法对元素进行排序。有以下三种用法,下面分别说明:
默认排序:对元素中不管什么类型的元素,都把它当成string,按照Unicode值来进行排序。如果元素类型是个自定义的对象,且定义了toString()函数,会用这个函数来转成string进行比较。
用定义的比较函数进行排序:sort(compareFunction)
用指定的排序方式排序:可以用下面的值或用|来组合下面的值进行排序
1 or Array.CASEINSENSITIVE
2 or Array.DESCENDING
4 or Array.UNIQUESORT
8 or Array.RETURNINDEXEDARRAY
16 or Array.NUMERIC
sortOn:用不稳定的排序算法根据元素中的一个或多个属性进行排序。这种排序方法要求数组中所有的元素都有一个以上的属性,且必须至少有一个相同的属性。其用法看下面的例子:
arr.sortOn(someFieldName);//按默认的string的unicode值排序,先按第一个属性排,再依次按后面的属性排
arr.sortOn(someFieldName, Array.DESCENDING | Array.NUMERIC);//对所有的属性都按数值的降序排序
arr.sortOn (["a", "b", "c"], [Array.DESCENDING, Array.NUMERIC, Array.CASEINSENSITIVE]);//对于属性a按字母降序排,对属性b按数字升序排,对属性c按字母忽略大小写升序排
六.遍历元素
Array和Vector都提供了五种遍历数组中元素的方法。
forEach(callback:Function,thisObject:*=null)对数组中每项元素都执行回调函数。回调函数无需返回值。
map(callback:Function,thisObject:*=null)根据回调函数操作原数组每个元素,并利用回调函数返回结果生成新数组。
filter(callback:Function,thisObject:*=null):将所有让回调函数返回true的元素提出来,构成新数组返回。。
some(callback:Function,thisObject:*=null)只要有一个元素让回调函数返回true,则some返回true。
every(callback:Function,thisObject:*=null)当所有元素让回调函数返回true,every才返回true。
这些遍历方法为我们提供了非常方便的对一组数据进行处理的办法。
下面让我们假象下面的用例并进行实现:对一系列的对象,找出其中的人,对每个人返回其薪水,判断是否所有人都大于20岁,是男性,且是否存在男性。
public class People { public var name:String; public var sex:String; public var age:int; public var salary:int; public function People(n:String,sx:String,a:int,sa:int) { name = n; sex = sx; age = a; salary = sa; } public function toString():String { return "name:" + name + ",sex:" + sex + ",age:" + age + ",salary:" + salary; } }
public function IsPeople(item:*,index:int,arr:Array):Boolean { if (item is People) { return true; } else { return false; } } public function Out(item:*,index:int,arr:Array):void { trace(item.toString()); } public function GetSalary(item:People, index:int, arr:Array):int { return item.salary; } public function Oldthan20(item:People, index:int, arr:Array):Boolean { return item.age > 20; } public function IsMale(item:People, index:int, arr:Array):Boolean { return item.sex == "male"; }
var arr:Array = new Array(1, new People("jack", "male", 28, 5000), "a", new People("rose", "female", 24, 7000), new Object(), new People("ring", "female", 30, 2000), new People("sam", "male", 35, 10000)); var peoples:Array = arr.filter(IsPeople);//找出所有人 peoples.forEach(Out); var salarys:Array = peoples.map(GetSalary);//获取工资 salarys.forEach(Out); trace(peoples.every(Oldthan20));//是否全部大于20岁 trace(peoples.some(IsMale));//是否存在男性 trace(peoples.every(IsMale));//是否全部都是男性
作者:Jingle Guo
出处:http://www.cnblogs.com/studynote/
若标题中有“转载”字样,则本文版权归原作者所有。若无转载字样,本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.