zoukankan      html  css  js  c++  java
  • 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;
            }
        }
    }
  • 相关阅读:
    校验字符的表达式
    校验数字的表达式
    Html和xhtml有什么区别
    VUE3.0 + TS 项目实战 (2)基本写法
    VUE3.0 + TS 项目实战 (1)初始化项目
    props传递函数以及$emit触发父组件方法
    rollup
    js函数式编程
    移动端双击事件
    JS节流与防抖
  • 原文地址:https://www.cnblogs.com/dongliyang/p/3437161.html
Copyright © 2011-2022 走看看