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