package game.utils
{
import flash.utils.Dictionary;
/**
* 類似java中HashMap類的實現 繼承於IMap 具體方法說明見IMap中的註釋
* */
public class HashMap
{
/**
* 鍵名數組,存儲鍵名
* */
private var _keys:Array=null;
/**
* 鍵值字典
* */
private var props:Dictionary=null;
/**
* 構造函數
* */
public function HashMap(org:Array = null) {
this.clear();
if (org != null)
for each (var val:Object in org)
{
if (val.hasOwnProperty("key") && val.hasOwnProperty("val"))
this.put(val.key, val.val);
}
}
/**
* 清除數據
* */
public function clear():void {
this.props=new Dictionary ;
this._keys=new Array ;
}
/**
* 是否包含指定的鍵名
* */
public function containsKey(key:Object):Boolean {
return this.props[key]!=null;
}
/**
* 是否包含指定的鍵值
* */
public function containsValue(value:Object):Boolean {
var result:Boolean=false;
var len:uint=this.size();
if (len>0) {
for (var i:uint=0; i<len; i++) {
if (this.props[this._keys[i]]==value) {
result = true;
break;
}
}
}
return result;
}
/**
* 獲取指定的鍵值
* */
public function getValue(key:Object):Object {
return this.props[key];
}
/**
* 獲取指定的鍵值
* 並刪除
* */
public function getValueAndRemove(key:Object):Object{
var i:Object=this.props[key];
this.remove(key);
return i;
}
/**
* 添加一個新鍵到末端
* */
public function put(key:Object,value:Object):Object {
var result:Object=null;
if (this.containsKey(key)) {
result=this.getValue(key);
this.props[key]=value;
} else {
this.props[key]=value;
this._keys.push(key);
}
return result;
}
/**
* 添加一個新鍵到末端 ,並且根據KEY排序,目前支持數字key
* */
public function putAndSort(key:Object,value:Object):Object{
var result:Object=null;
if (this.containsKey(key)) {
result=this.getValue(key);
this.props[key]=value;
} else {
this.props[key]=value;
this._keys.push(key);
}
_keys.sort(Array.NUMERIC);
return result;
}
/**
* 移除一個鍵
* */
public function remove(key:Object):Object {
var result:Object=null;
if (this.containsKey(key)) {
delete this.props[key];
var index:int=this._keys.indexOf(key);
if (index>-1) {
this._keys.splice(index,1);
}
}
return result;
}
/**
* 填充HashMap數據
* */
public function putAll(map:HashMap):void {
this.clear();
var len:uint=map.size();
if (len>0) {
var arr:Array=map.keys();
for (var i:uint=0; i<len; i++) {
this.put(arr[i],map.getValue(arr[i]));
}
}
}
/**
* 返回數據的長度
* */
public function size():uint {
return this._keys.length;
}
/**
*返回是否包含數據
* */
public function isEmpty():Boolean {
return this.size() <1;
}
/**
* 返回HashMap數據
* */
public function values():Array {
var result:Array=new Array ;
var len:uint=this.size();
if (len>0) {
for (var i:uint=0; i<len; i++) {
result.push(this.props[this._keys[i]]);
}
}
return result;
}
/**
* 返回鍵名數組
* */
public function keys():Array {
return this._keys;
}
}
}