2010年2月21日 星期日

ArrayUtil 方便陣列使用的工具

已將這個類別納入開源專案之中,
https://code.google.com/p/actionscript-3-advanced-object/

內含五個方法

unique(arr:*):Array
消除陣列中的重覆項目。

union(arr1:* , arr2:*):Array
傳回二個陣列間的聯集,會消除重覆的項目。

intersect(arr1:* , arr2:*):Array
傳回二個陣列間的交集,會消除重覆的項目。

isInclude(arr1:* , arr2:*):Boolean
陣列1是否包含了陣列2的所有物件,會消除重覆的項目。

difference(arr1:* , arr2:*):Array
陣列1和陣列2的差(陣列1中有但陣列2中沒有的),會消除重覆的項目。



ArrayUtil
package tw.right929.utils
{
    import flash.utils.Dictionary;

    /**
     * 全靜態類別,用來處理陣列。
     * 所有傳入的參數物件必需下述條件其中之一,才能正常的運作。
     * 1.必需有length屬性,能用[]運算子配合index取出物件。
     * 2.有unique方法,其傳回不重覆項目陣列。
     */
    public class ArrayUtil
    {
        /**
         * 把所有ArrayUtil中的方法,混入傳入的obj之中。
         */
        public static function mixin(obj:*):void
        {
            if(!obj.hasOwnProperty("unique"))
                obj["unique"]    =    uniqueF;
            obj["union"]    =    unionF;
            obj["intersect"]    =    intersectF;
            obj["isInclude"]    =    isIncludeF;
            obj["difference"]    =    differenceF;
        }
        
        /**
         * 消除陣列中的重覆項目。
         */
        public static function unique(arr:*):Array
        {
            if(arr.hasOwnProperty("unique"))
                return arr.unique();
            
            var map:Dictionary    =    new Dictionary(true);
            for(var i:int=0 ; i<arr.length ; i++)
                map[arr[i]]    =    i;
            
            var temp:Array    =    new Array();
            for(var p:* in map)
                temp.push(p);
            
            return temp;
        }
        /**
         * 消除陣列中的重覆項目。(mixin專用)
         */
        public static var uniqueF:Function    =    function ():Array
        {
            return ArrayUtil.unique(this);
        };
        
        /**
         * 傳回二個陣列間的聯集,會消除重覆的項目。
         */
        public static function union(arr1:* , arr2:*):Array
        {
            arr1    =    ArrayUtil.unique(arr1);
            arr2    =    ArrayUtil.unique(arr2);
            return ArrayUtil.unique(arr1.concat(arr2));
        }
        /**
         * 傳回二個陣列間的聯集,會消除重覆的項目。(mixin專用)
         */
        public static var unionF:Function    =    function (arr:*):Array
        {
            return ArrayUtil.union(this , arr);
        };
        
        /**
         * 傳回二個陣列間的交集,會消除重覆的項目。
         */
        public static function intersect(arr1:* , arr2:*):Array
        {
            arr1    =    ArrayUtil.unique(arr1);
            arr2    =    ArrayUtil.unique(arr2);
            
            if(arr1.length > arr2.length)
                return _intersect(arr1 , arr2);
            else
                return _intersect(arr2 , arr1);
        }
        private static function _intersect(arr1:Array , arr2:Array):Array
        {
            var temp:Array    =    new Array();
            for(var j:int=0 ; j<arr1.length ; j++)
            {
                for(var i:int=0 ; i<arr2.length ; i++)
                {
                    if(arr1[j] == arr2[i])
                    {
                        temp.push(arr1[j]);
                        arr2.splice(i , 1);
                        break;
                    }
                }
            }
            return temp;    
        }
        /**
         * 傳回二個陣列間的交集,會消除重覆的項目。(mixin專用)
         */
        public static var intersectF:Function    =    function (arr:*):Array
        {
            return ArrayUtil.intersect(this , arr);
        };
            
        
        /**
         * 陣列1是否包含了陣列2的所有物件,會消除重覆的項目。
         */
        public static function isInclude(arr1:* , arr2:*):Boolean
        {
            arr1    =    ArrayUtil.unique(arr1);
            arr2    =    ArrayUtil.unique(arr2);
            
            if(arr2.length > arr1.length)
                return false;
            return intersect(arr1 , arr2).length == arr2.length;
        }
        /**
         * 陣列是否包含了傳入陣列的所有物件,會消除重覆的項目。(mixin專用)
         */
        public static var isIncludeF:Function    =    function (arr:*):Boolean
        {
            return ArrayUtil.isInclude(this , arr);
        };
        
        /**
         * 陣列1和陣列2的差(陣列1中有但陣列2中沒有的),會消除重覆的項目。
         */
        public static function difference(arr1:* , arr2:*):Array
        {
            arr1    =    ArrayUtil.unique(arr1);
            arr2    =    ArrayUtil.unique(arr2);
            
            for(var j:int=0 ; j<arr2.length ; j++)
            {
                for(var i:int=0 ; i<arr1.length ; i++)
                {
                    if(arr2[j] == arr1[i])
                    {
                        arr1.splice(i , 1);
                        break;
                    }
                }
            }
            return arr1;    
        }
        /**
         * 陣列1和陣列2的差(陣列1中有但陣列2中沒有的),會消除重覆的項目。(mixin專用)
         */
        public static var differenceF:Function    =    function (arr:*):Array
        {
            return ArrayUtil.difference(this , arr);
        };
    }
}

測試
<?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 tw.right929.utils.ArrayUtil;
            
            private var _arr1:Array    =    [0,1,1,2,3,3];
            private var _arr2:Array    =    [2,3,3,4];
            private var _arr3:Array    =    [1,2];
            
            private var _obj1:Object    =    {x:1 , y:1};
            private var _obj2:Object    =    {y:2 , z:2};
            private var _obj3:Object    =    {x:3};
            
            private function init():void
            {
                trace(ArrayUtil.unique(_arr1));//[0,1,2,3]
                trace(ArrayUtil.union(_arr1 , _arr2));//[0,1,2,3,4]
                trace(ArrayUtil.intersect(_arr1 , _arr2));//[2,3]
                trace(ArrayUtil.difference(_arr1 , _arr2));//[0,1]
                trace(ArrayUtil.isInclude(_arr1 , _arr3));//true
                trace(ArrayUtil.isInclude(_arr2 , _arr3));//false
                
                ArrayUtil.mixin(Array.prototype);
                
                trace(_arr1.unique());//[0,1,2,3]
                trace(_arr1.union(_arr2));//[0,1,2,3,4]
                trace(_arr1.intersect(_arr2));//[2,3]
                trace(_arr1.difference(_arr2));//[0,1]
                trace(_arr1.isInclude(_arr3));//true
                trace(_arr2.isInclude(_arr3));//false
                
                
                _obj1["unique"]    =    _unique;
                _obj2["unique"]    =    _unique;
                _obj3["unique"]    =    _unique;
                ArrayUtil.mixin(_obj1);
                ArrayUtil.mixin(_obj2);
                ArrayUtil.mixin(_obj3);
                trace(_obj1.unique());//[unique,intersect,difference,union,x,isInclude,y]
                trace(_obj1.union(_obj2));//[intersect,z,difference,y,unique,isInclude,union,x]
                trace(_obj1.intersect(_obj2));//[intersect,difference,union,unique,isInclude,y]
                trace(_obj1.difference(_obj2));//[x]
                trace(_obj1.isInclude(_obj3));//true
                trace(_obj2.isInclude(_obj3));//false
            }
            
            private var _unique:Function    =    function ():Array
                                                {
                                                    var temp:Array    =    new Array();
                                                    for(var p:String in this)
                                                    {
                                                        temp.push(p);
                                                    }
                                                    return temp;
                                                };
        ]]>
    </fx:Script>
</s:Application>

沒有留言:

張貼留言

追蹤者