搜尋文章

2013年2月21日 星期四

as3-vector sort


在as3裡,vector可以透過sort()函數來進行排序
跟array比較不同的是,array的sort可以不帶參數或是用定義好的參數帶入
例如:
Array.CASEINSENSITIVE:這個選項會忽略大小寫限制加以排序。例如,小寫字母 b 會排在大寫字母 D 之前。

Array.DESCENDING:這會反轉預設的依遞增順序排序。例如,字母 B 會排在字母 A 之前。

Array.UNIQUESORT:這會在發現兩個相同的值時,中止排序作業。

Array.NUMERIC:這會進行數值排序,因此 3 會排在 10 之前。
在vector的sort裡一定要帶入一個自訂義用來執行排序的function,或是也可以使用上面的參數帶入
例如:vector.sort(Array.CASEINSENSITIVE);
如果今天有5個MovieClip要進行名字的排序的話,就可以用自定義的涵式來執行了。
import flash.display.MovieClip;
import flash.text.TextField;

//先建立5個MovieClip
var mc1:MovieClip = new MovieClip();
var mc2:MovieClip = new MovieClip();
var mc3:MovieClip = new MovieClip();
var mc4:MovieClip = new MovieClip();
var mc5:MovieClip = new MovieClip();
//命名
mc1.name = "mc_1";
mc2.name = "mc_2";
mc3.name = "mc_3";
mc4.name = "mc_4";
mc5.name = "mc_5";
//此時在mcVector裡的MovieClip已經不是按照mc_1、mc_2 ...的順序排列了
var mcVector:Vector.<MovieClip>  = new Vector.<MovieClip>();

mcVector[0] = mc3;
mcVector[1] = mc5;
mcVector[2] = mc1;
mcVector[3] = mc4;
mcVector[4] = mc2;
trace(showName(mcVector));
//output mc_3,mc_5,mc_1,mc_4,mc_2
mcVector.sort(vectorSortFunction);
trace(showName(mcVector));
//output mc_1,mc_2,mc_3,mc_4,mc_5

function vectorSortFunction(firstMc:MovieClip , secandMc:MovieClip)
{
  //先把名字後面的數字拆出來
  var number1:int = int(firstMc.name.split("_")[1]);
  var number2:int = int(secandMc.name.split("_")[1]);
  //之後在用數字去作排序
  if (number1 > number2)
  {
    //這邊返回1的意思是,如果前面的數字大於後面的數字,前面的對象就要往後排
    return 1;
  }
  else if (number1 < number2)
  {
    //返回-1的意思是,如果前面的數字小於後面的數字,前面的對象就要往前排
    return -1;
  }
  else
  {
    //返回0的意思是,一樣的話就不變動順序
    return 0;
  }
}

function showName(vector:Vector.<MovieClip>):String
{
  var _txt:TextField = new TextField();;
  for each (var mc:MovieClip in vector)
  {
    
    _txt.appendText(mc.name+",");
  }
  
  return _txt.text;
}