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));//是否全部都是男性

 

posted @ 2013-03-26 21:48  Jingle Guo  阅读(4910)  评论(0编辑  收藏  举报