AS3基础教程-第17课-Array数组(3)
1、sort() 方法
对数组中的元素进行排序。默认情况下,按下面列表中的说明进行排序: * 按升序排序(a 优先于b)。 * 排序区分大小写(Z 优先于a)。 * 数值字段按字符串方式进行排序,因此 100 优先于 99,因为 "1" 的字符串值比 "9" 的低。
* 修改该数组以反映排序顺序;在排序后的数组中不按任何特定顺序连续放置具有相同排序字段的多个元素。
2、举例:
var myarray:Array=new Array(3,4,"z",1,2,5,100,"a",345,"C",143); myarray.sort(); trace(myarray); //输出为:1,100,143,2,3,345,4,5,C,a,z
1、sort() 方法内可以加参数,从而实现个性的排序方式。
flash内置了几个预定的参数以实现常见的排序【当然,你还可以创建自己的自定义函数来进行排序】
2、flash内置的5个预定参数:
Array.CASEINSENSITIVE 或 1 Array.DESCENDING 或 2 Array.UNIQUESORT 或 4 Array.RETURNINDEXEDARRAY 或 8 Array.NUMERIC 或 16
如上所示,可以用英文,也可以用数字。推荐大家用英文,而不是数字。
因为数字没有什么特别意义,时间长了很快就遗忘了。
但是英文都有特定意义,而且编程时,只要你输入了Array.(注意,有一个点)就会自动出现一个下拉列表,列表内就会出现上面的5个单词【见下图】,也就是说,你无须记住单词的拼写,你只需记住单词的大致模样即可,超级省劲。

3、现在详述上面的5个参数:
(1)第一个单词CASEINSENSITIVE其实可以分开来记忆case in sensitive 翻译成中文就是“敏感的情况”【额,学习AS编程时,很多代码都是英文中的单词,大家可以配合着有道词典或者金山词霸等语言翻译软件来记忆学习,最好将发音给弄清】。CASEINSENSITIVE表示大小写不敏感,且按字母顺序排序举例:var myarray:Array=["US","CHINA","china","korea","KOREA"]; trace(myarray.sort()); //不加参数,就是默认情况,字母的大小写是敏感的trace(myarray.sort(Array.CASEINSENSITIVE)); //加上CASEINSENSITIVE参数后,大小写不再敏感/*输出如下:CHINA,KOREA,US,china,koreaCHINA,china,KOREA,korea,US*/(2)第二个单词DESCENDING,翻译成中文是“递减;下降”。用来表示按倒序排列(DESCENDING排序与默认的排序完全相反,相当于在默认排序的基础上又使用了reverse() 方法)var myarray:Array=[1,12,25,2,"as","a","A"]; trace(myarray.sort()); trace(myarray.sort(Array.DESCENDING)); /*输出如下:1,12,2,25,A,a,asas,a,A,25,2,12,1*/(3)第三个单词UNIQUESORT 是unique sort这两个单词的拼凑,翻译成中文是“唯一性排序”var myarray:Array=[15,1,230,15]; trace(myarray.sort()); trace(myarray.sort(Array.UNIQUESORT)); //因为数组内有两个完全一样的数字15,所以无法实现“唯一性排序”,故而排序失败,输出为0/*输出如下:1,15,15,2300*/(4)第四个单词RETURNINDEXEDARRAY是由三个单词拼凑起来的:return indexed array 翻译成中文就是“返回编入索引的数组”就是用来让sort()函数返回值返回排序后的索引列表,同时保持原数组不变下例没有什么使用价值,只是让大家晓得,RETURNINDEXEDARRAY返回的是索引。RETURNINDEXEDARRAY的真正用途请参看补充说明var myarray:Array=["test",1,230,15,"a","aS"]; trace(myarray.sort()); trace(myarray.sort(Array.RETURNINDEXEDARRAY)); //myarray内共有6个元素,索引从0开始,依次递增到5/*输出如下:1,15,230,a,aS,test0,1,2,3,4,5*/(5)第五个单词NUMERIC 翻译成中文就是“数字”将数值强制性的按照从小到大来排列,不用改参数的话,就是默认排序,所有的数字都会被当成字符串来排序var myarray:Array=[2005,12,1000]; trace(myarray.sort()); trace(myarray.sort(Array.NUMERIC)); //三个数中12最小,排序后被放在最前面;2005最大,排序后被放在了最后面/*输出如下:1000,12,200512,1000,2005*/
4、补充说明:
上述5个参数,可以联合多个起作用,中间用|符号链接即可。
比如说:var myarray:Array=[2005,12,1000]; trace(myarray.sort(Array.NUMERIC))//将元素们按照数字从小到大排列,输出为12,1000,2005将排序模式修改为两者并列如下:var myarray:Array=[2005,12,1000]; trace(myarray.sort(Array.NUMERIC|Array.RETURNINDEXEDARRAY)); /* 将元素按照数字大小排列时,返回排序的索引。输出为1,2,0分析如下:原数组的元素12在索引为1的位置;1000在索引为2的位置;2005在索引为0的位置也就是说,通过RETURNINDEXEDARRAY可以让flash告诉我们NUMERIC是将元素的位置都如何放置的*/
1、说明:
自定义函数内必须提供两个参数(假如说是A和B),该自定义的函数的返回结果只能是-1、0、1三者中的一个。
自定义的比较函数的作用:程序会自动将数组内的元素一对对的取出来,分别作为这个自定义的比较函数的两个参数A和B。
如果返回1,那么作为A参数的数组元素应当排在B后面如果返回-1,A应排在B前面如果返回0,且指定的排序方式是Array.UNIQUESORT的话,数组排序就会认为失败并返回数值0
2、举例:
定义一个用户名和密码的数组,格式是"用户名:密码"。
经过自定义函数排序后,要让数组内的字符串按照用户名来进行排序
var passwords_array:Array = new Array("mom:glam", "ana:ring", "jay:mag", "anne:home", "regina:silly");function order(a, b):int { //自定义了一个名为order的函数,它有两个参数a和b,通过:Number指定了必须有返回值,且返回值的类型是数字 var name1:String = a.split(":")[0]; var name2:String = b.split(":")[0];/* 用a和b来代表数组内的两个任意元素。因为这个数组内所有的元素都是字符串,所以,使用字符串的方法split(参数1)[参数2],它用来将字符串按照提供的参数1来进行分割,并返回分割后的索引为参数2位置的字符串以原数组第一个元素"mom:glam"为例,a.split(":")[0]的意思就是将mom:glam按照冒号分割开来(变成mom和glam两部分),然后返回索引为0位置的字符串(mom)也就是说,定义两个字符串变量name1和name2,他们都是代表原数组内每一个元素的冒号之前的部分(就是用户名)自定义的比较函数,就是将提取出来的name1和name2进行比较,情况有三种*/ if (name1<name2) { return -1;//将较小的A放在较大的B前面 } else if (name1>name2) { return 1;//将较大的A放在较小的B后面。这两种情况其实是一样的,就是将小的放在前面 } else { return 0; }}trace(passwords_array);//输出原数组,没有使用排序passwords_array.sort(order);//对原数组进行自定义排序(后台排序,没有让它输出,我们看不见任何东东)trace(passwords_array);//将排序后的原数组进行输出。发现,数组改变了/*输出如下:mom:glam,ana:ring,jay:mag,anne:home,regina:sillyana:ring,anne:home,jay:mag,mom:glam,regina:silly*/
3、思考一下:
对于上例,如果要按照密码来排序,代码应该如何修改呢?