2010年2月23日 星期二

SequenceCollectionUtil

有順序的集合的操作工具。
有順序的集合(以從0開始的連續整數為索引)
應具有length:uint屬性,
及下述方法:
1.addAt(obj:* , index:int):*
2.removeAt(index:int):*
3.getAt(index:int):*



SequenceCollectionUtil
package tw.right929.utils
{
    /**
     * 有順序的集合的操作工具。
     * 有順序的集合(以從0開始的連續整數為索引)
     * 應具有length:uint屬性,
     * 及下述方法:
     * 1.addAt(obj:* , index:int):*
     * 2.removeAt(index:int):*
     * 3.getAt(index:int):*
     */
    public class SequenceCollectionUtil
    {
        public static function mixin(arr:*):void
        {
            arr["push"]            =    pushF;
            arr["pop"]            =    popF;
            arr["unshift"]        =    unshiftF;
            arr["shift"]        =    shiftF;
            arr["getIndex"]        =    getIndexF;
            arr["downIndex"]    =    downIndexF;
            arr["downIndexAt"]    =    downIndexAtF;
            arr["upIndex"]        =    upIndexF;
            arr["upIndexAt"]    =    upIndexAtF;
            arr["swapAt"]        =    swapAtF;
            arr["swap"]            =    swapF;
            arr["moveTo"]        =    moveToF;
            arr["moveToAt"]        =    moveToAtF;
        }
        
        /**
         * 將傳入的物件加到最後,並傳回新的長度。
         */
        public static function push(arr:* , ...args):uint
        {
            for(var i:int=0 ; i<args.length ; i++)
                arr.addAt(args[i] , arr.length);
            return arr.length;
        }
        /**
         * 將傳入的物件加到最後,並傳回新的長度。(mixin專用)
         */
        public static var pushF:Function    =    function (...args):uint
        {
            args.unshift(this);
            return SequenceCollectionUtil.push.apply(this , args);
        }
        
        /**
         * 刪除並傳回最後的一個物件。
         */
        public static function pop(arr:*):*
        {
            if(arr.length <= 0)
                return null;
            return arr.removeAt(arr.length-1);
        }
        /**
         * 刪除並傳回最後的一個物件。(mixin專用)
         */
        public static var popF:Function    =    function ():*
        {
            return SequenceCollectionUtil.pop(this);
        }
        
        /**
         * 將傳入的物件加到最前,並傳回新的長度。
         */
        public static function unshift(arr:* , ...args):uint
        {
            for(var i:int=args.length-1 ; i>=0 ; i--)
                arr.addAt(args[i] , 0);
            return arr.length;
        }
        /**
         * 將傳入的物件加到最前,並傳回新的長度。(mixin專用)
         */
        public static var unshiftF:Function    =    function (...args):uint
        {
            args.unshift(this);
            return SequenceCollectionUtil.unshift.apply(this , args);
        }
        
        /**
         * 刪除並傳回最前的一個物件。
         */
        public static function shift(arr:*):*
        {
            if(arr.length <= 0)
                return null;
            return arr.removeAt(0);
        }
        /**
         * 刪除並傳回最前的一個物件。(mixin專用)
         */
        public static var shiftF:Function    =    function ():*
        {
            return SequenceCollectionUtil.shift(this);
        }
        
        /**
         * 取得傳入的obj在arr中的索引位置。
         */
        public static function getIndex(arr:* , obj:*):int
        {
            for(var i:int=0 ; i<arr.length ; i++)
            {
                if(arr.getAt(i) == obj)
                    return i;
            }
            return -1;
        }
        /**
         * 取得傳入的obj在arr中的索引位置。(mixin專用)
         */
        public static var getIndexF:Function    =    function (obj:*):int
        {
            return SequenceCollectionUtil.getIndex(this , obj);
        }
        
        /**
         * 交換傳入物件的索引位置和其索引位置減一的物件。
         */
        public static function downIndex(arr:* , obj:*):void
        {
            var index:int    =    SequenceCollectionUtil.getIndex(arr , obj);
            SequenceCollectionUtil.downIndexAt(arr , index);
        }
        /**
         * 交換傳入物件的索引位置和其索引位置減一的物件。(mixin專用)
         */
        public static var downIndexF:Function    =    function (obj:*):void
        {
            SequenceCollectionUtil.downIndex(this , obj);
        }
        
        /**
         * 交換傳入的索引位置和索引位置減一的物件。
         */
        public static function downIndexAt(arr:* , index:int):void
        {
            if(index > 0 && index < arr.length)
                SequenceCollectionUtil.swapAt(arr , index , index-1);
        }
        /**
         * 交換傳入的索引位置和索引位置減一的物件。(mixin專用)
         */
        public static var downIndexAtF:Function    =    function (index:int):void
        {
            SequenceCollectionUtil.downIndexAt(this , index);
        }
            
        /**
         * 交換傳入物件的索引位置和其索引位置加一的物件。
         */
        public static function upIndex(arr:* , obj:*):void
        {
            var index:int    =    SequenceCollectionUtil.getIndex(arr , obj);
            SequenceCollectionUtil.upIndexAt(arr , index);
        }
        /**
         * 交換傳入物件的索引位置和其索引位置加一的物件。(mixin專用)
         */
        public static var upIndexF:Function    =    function (obj:*):void
        {
            SequenceCollectionUtil.upIndex(this , obj);
        }
        
        /**
         * 交換傳入索引位置和索引位置加一的物件。
         */
        public static function upIndexAt(arr:* , index:int):void
        {
            if(index < arr.length-1 && index >= 0)
                SequenceCollectionUtil.swapAt(arr , index , index+1);
        }
        /**
         * 交換傳入索引位置和索引位置加一的物件。(mixin專用)
         */
        public static var upIndexAtF:Function    =    function (index:int):void
        {
            SequenceCollectionUtil.upIndexAt(this , index);
        }
        
        /**
         * 交換傳入的二個索引位置的物件。
         */
        public static function swapAt(arr:* , index1:int , index2:int):void
        {
            if(index1 == index2) return;
            if(index1 < 0 || index1 >= arr.length) return;
            if(index2 < 0 || index2 >= arr.length) return;
            
            if(index1 > index2)
            {
                arr.addAt(arr.removeAt(index1) , index2);
                arr.addAt(arr.removeAt(index2+1) , index1);
            }
            else
            {
                arr.addAt(arr.removeAt(index2) , index1);
                arr.addAt(arr.removeAt(index1+1) , index2);
            }
        }
        /**
         * 交換傳入的二個索引位置的物件。(mixin專用)
         */
        public static var swapAtF:Function    =    function (index1:int , index2:int):void
        {
            SequenceCollectionUtil.swapAt(this , index1 , index2);
        }
        
        /**
         * 交換二個物件的索引位置。
         */
        public static function swap(arr:* , obj1:* , obj2:*):void
        {
            swapAt(arr , SequenceCollectionUtil.getIndex(arr , obj1) , SequenceCollectionUtil.getIndex(arr , obj2));
        }
        /**
         * 交換二個物件的索引位置。(mixin專用)
         */
        public static var swapF:Function    =    function (obj1:* , obj2:*):void
        {
            SequenceCollectionUtil.swap(this , obj1 , obj2);
        }
        
        /**
         * 改變傳入物件的索引位置。
         */
        public static function moveTo(arr:* , obj:* , index:int):void
        {
            SequenceCollectionUtil.moveToAt(arr , SequenceCollectionUtil.getIndex(arr , obj) , index);
        }
        /**
         * 改變傳入物件的索引位置。(mixin專用)
         */
        public static var moveToF:Function    =    function (obj:* , index:int):void
        {
            SequenceCollectionUtil.moveTo(this , obj , index);
        }
        
        /**
         * 改變傳入索引位置物件的索引位置。
         */
        public static function moveToAt(arr:* , oldIndex:int , newIndex:int):void
        {
            if(oldIndex == newIndex) return;
            if(oldIndex < 0 || oldIndex >= arr.length) return;
            if(newIndex < 0 || newIndex >= arr.length) return;
            
            arr.addAt(arr.removeAt(oldIndex) , newIndex);
        }
        /**
         * 改變傳入索引位置物件的索引位置。(mixin專用)
         */
        public static var moveToAtF:Function    =    function (oldIndex:int , newIndex:int):void
        {
            SequenceCollectionUtil.moveToAt(this , oldIndex , newIndex);
        }
    }
}
測試
<?xml version="1.0" encoding="utf-8"?>
<s:Application creationComplete="init()" xmlns:fx="http://ns.adobe.com/mxml/2009" 
               xmlns:s="library://ns.adobe.com/flex/spark" 
               xmlns:mx="library://ns.adobe.com/flex/halo" minWidth="1024" minHeight="768">
    <fx:Script>
        <![CDATA[
            import test.TestArray;
            
            import tw.right929.proxy.AdvancedProxy;
            import tw.right929.utils.SequenceCollectionUtil;
            
            private function init():void
            {
                var arr:Array    =    new Array();
                var arrProxy:AdvancedProxy    =    new AdvancedProxy();
                arrProxy["addAt"]    =    function (obj:* , index:int):*
                                        {
                                            this.$super.splice(index , 0 , obj);
                                            return obj;
                                        };
                arrProxy["removeAt"]    =    function (index:int):*
                                        {
                                            return this.$super.splice(index , 1)[0];
                                        };
                arrProxy["getAt"]    =    function (index:int):*
                                        {
                                            return this.$super[index];
                                        };
                arrProxy["toString"]    =    function ():String
                                        {
                                            return this.$super.toString();
                                        };
                SequenceCollectionUtil.mixin(arrProxy);
                arrProxy.$super    =    arr;
                
                arrProxy.push(0 , 1 , 2 , 3 , 4);
                trace(arrProxy);//0,1,2,3,4
                trace(arrProxy.pop());//4
                trace(arrProxy.shift());//0
                arrProxy.unshift(0);
                trace(arrProxy);//0,1,2,3
                trace(arrProxy.getAt(0));//0
                arrProxy.downIndex(2);
                trace(arrProxy);//0,2,1,3
                arrProxy.downIndexAt(3);
                trace(arrProxy);//0,2,3,1
                arrProxy.upIndex(3);
                trace(arrProxy);//0,2,1,3
                arrProxy.upIndexAt(1);
                trace(arrProxy);//0,1,2,3
                arrProxy.swap(1 , 3);
                trace(arrProxy);//0,3,2,1
                arrProxy.swapAt(3 , 1);
                trace(arrProxy);//0,1,2,3
                arrProxy.moveTo(0 , 2);
                trace(arrProxy);//1,2,0,3
                arrProxy.moveToAt(2 , 0);
                trace(arrProxy);//0,1,2,3
            }
        ]]>
    </fx:Script>
</s:Application>

沒有留言:

張貼留言

追蹤者