Flex ActionScript版本的Map類型

  ActionScript中沒有Map類型,由於Object就至關於Map了。Object的屬性至關於key,值至關於value。java

也就是說,沒有必要有Map類型。可是,這樣作,也會帶來一些問題,形成不怎麼方便。好比:須要知道當前Object有多少個屬性,屬性值都是什麼。另外,從代碼可讀性上也有點不方便,當把Object當成Map來使用的時候,除非寫了註釋,不然,別人不知道這個Object的做用是Map。測試

    下面完成了ActionScript的Map類型,其實就是對Object進行了封裝,沒什麼技術含量。不過,對於Java開發人員,使用起來仍是很直觀的。spa

  Map.ascode

package common.Utils {
    
    import mx.utils.ObjectUtil;
    
    /*
     * 參照java.util.Map接口編寫,因爲ActionScript和Java的差別,去掉了一些方法。
     * 被去掉的方法有:entrySet()、equals()、hashCode()
     */
    
    /**
     * <code>Map</code>映射類型。
     * 將鍵映射到值的對象。一個映射不能包含重複的鍵;每一個鍵最多隻能映射到一個值。 
     * 禁止使用<code>null</code>做爲鍵值,不然拋出異常。
     * 公開的方法有:
     * <ul>
     *  <li><code>clear():void</code></li>
     *  <li><code>containsKey(key:String):Boolean</code></li>
     *  <li><code>containsValue(value:Object):Boolean</code></li>
     *  <li><code>isEmpty():Boolean</code></li>
     *  <li><code>keySet():Array</code></li>
     *  <li><code>put(key:String,value:Object):Object</code></li>
     *  <li><code>putAll(map:Map):void</code></li>
     *  <li><code>get(key:String):Object</code></li>
     *  <li><code>remove(key:String):Object</code></li>
     *  <li><code>size():int</code></li>
     *  <li><code> values():Array</code></li>
     * </ul>
     * @version 1.0 2013/11/21
     * @author dongliyang 
     */
    public class Map {
        
        private var _dataMap:Object = null;
        
        /**
         * <code>Map</code>映射類型。
         * 將鍵映射到值的對象。一個映射不能包含重複的鍵;每一個鍵最多隻能映射到一個值。 
         * 禁止使用<code>null</code>做爲鍵值,不然拋出異常。
         * 公開的方法有:
         * <ul>
         *  <li><code>clear():void</code></li>
         *  <li><code>containsKey(key:String):Boolean</code></li>
         *  <li><code>containsValue(value:Object):Boolean</code></li>
         *  <li><code>isEmpty():Boolean</code></li>
         *  <li><code>keySet():Array</code></li>
         *  <li><code>put(key:String,value:Object):Object</code></li>
         *  <li><code>putAll(map:Map):void</code></li>
         *  <li><code>get(key:String):Object</code></li>
         *  <li><code>remove(key:String):Object</code></li>
         *  <li><code>size():int</code></li>
         *  <li><code> values():Array</code></li>
         * </ul>
         */
        public function Map(){
            _dataMap = new Object();
        }
        
        /**
         * 今後映射中移除全部映射關係
         */
        public function clear():void {
            for each(var key:String in keys()){
                delete _dataMap[key];
            }
        }
        
        /**
         * 若是此映射包含指定鍵的映射關係,則返回<code>true</code>
         * @param key 測試是否存在於此映射中的鍵
         * @return 若是此映射中包含指定鍵的映射關係,則返回<code>true</code>
         */
        public function containsKey(key:String):Boolean {
            if(key == null){
                return false;
            }
            return _dataMap.hasOwnProperty(key);
        }
        
        /**
         * 若是此映射中將一個或多個鍵映射到指定值,則返回<code>true</code>
         * @param value 測試是否存在於此映射中的值
         * @return 若是此映射將一個或多個鍵映射到指定值,則返回<code>true</code>
         */
        public function containsValue(value:Object):Boolean {
            for each(var key:String in keys()){
                if(ObjectUtil.compare(_dataMap[key],value) == 0){
                    return true;
                }
            }
            return false;
        }
        
        /**
         * 若是此映射未包含鍵-值映射關係,則返回<code>true</code>
         * @return 若是此映射未包含鍵-值映射關係,則返回 <code>true</code>
         */
        public function isEmpty():Boolean {
            return keys().length == 0;
        }
        
        /**
         * 返回此映射中包含的鍵的<code>Array</code>視圖。
         * @return 此映射中包含的鍵的<code>Array</code>視圖
         */
        public function keySet():Array {
            return keys();
        }
        
        /**
         * 將指定的值與此映射中的指定鍵關聯。
         * 若是此映射之前包含一個該鍵的映射關係,則用指定值替換舊值。
         * @param key 與指定值關聯的鍵
         * @param value 與指定鍵關聯的值 
         * @return 之前與 key關聯的值,若是沒有針對 key 的映射關係,則返回 <code>null</code>
         */
        public function put(key:String,value:Object):Object {
            if(key == null){
                throw new Error("鍵值Key不能爲null");
            }
            if(containsKey(key)){
                var oldValue:Object = _dataMap[key];
                _dataMap[key] = value;
                return oldValue;
            } else {
                _dataMap[key] = value;
                return null;
            }
            
        }
        
        /**
         * 從指定映射中將全部映射關係複製到此映射中。
         * 對於指定映射中的每一個鍵key到值value的映射關係,此調用等效於對此映射調用一次 put(key,value)
         * @param map 要存儲在此映射中的映射關係 
         */
        public function putAll(map:Map):void {
            if(map == null){
                throw new Error("指定的映射Map爲null");
            }
            
            for each(var key:String in map.keySet()){
                _dataMap[key] = map.get(key);
            }
        }
        
        /**
         * 返回指定鍵所映射的值,若是此映射不包含該鍵的映射關係,則返回<code>null</code>
         * @param key 要返回其關聯值的鍵
         * @return 指定鍵所映射的值;若是此映射不包含該鍵的映射關係,則返回 <code>null</code> 
         */
        public function get(key:String):Object {
            if(containsKey(key)){
                return _dataMap[key];
            } else {
                return null;
            }
        }
        
        /**
         * 若是存在一個鍵的映射關係,則將其今後映射中移除。
         * 返回此映射中之前關聯該鍵的值,若是此映射中不包含該鍵的
         * 映射關係,則返回null。
         * 調用返回後,此映射將再也不包含指定鍵的映射關係。
         * @param key 從映射中移除其映射關係的鍵
         * @return 之前與key關聯的值,若是沒有key的映射關係,則返回<code>null</code>
         */
        public function remove(key:String):Object {
            if(containsKey(key)){
                var oldValue:Object = get(key);
                delete _dataMap[key];
                return oldValue;
            } else {
                return null;
            }
        }
        
        /**
         * 返回此映射中的鍵-值映射關係數。
         * @return 此映射中的鍵-值映射關係數
         */
        public function size():int {
            return keys().length;
        }
        
        /**
         * 返回此映射中包含的值得<code>Array</code>視圖
         * @return 此映射中包含的值的<code>Array</code>視圖
         */
        public function values():Array {
            var values:Array = new Array();
            for each(var key:String in keys()){
                values.push(_dataMap[key]);
            }
            return values;
        }
        
        /**
         * 返回此映射中包含的鍵的<code>Array</code>視圖
         * @return 返回此映射中包含的鍵的<code>Array</code>視圖
         */
        private function keys():Array {
            var clsInfo:Object = ObjectUtil.getClassInfo(_dataMap);
            var props:Array = clsInfo["properties"];
            var keys:Array = new Array();
            for each(var q:QName in props){
                keys.push(q.localName);
            }
            return keys;
        }
    }
}
相關文章
相關標籤/搜索