Flex ActionScript版本的Map类型

  ActionScript中没有Map类型,因为Object就相当于Map了。Object的属性相当于key,值相当于value。

也就是说,没有必要有Map类型。但是,这样做,也会带来一些问题,造成不怎么方便。比如:需要知道当前Object有多少个属性,属性值都是什么。另外,从代码可读性上也有点不方便,当把Object当成Map来使用的时候,除非写了注释,否则,别人不知道这个Object的作用是Map。

    下面完成了ActionScript的Map类型,其实就是对Object进行了封装,没什么技术含量。不过,对于Java开发人员,使用起来还是很直观的。

  Map.as

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;
        }
    }
}

 

posted on 2013-11-22 11:13  DongLiYang  阅读(1628)  评论(0编辑  收藏  举报

导航