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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM