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