package com.youbt.utils
{
import com.youbt.core.rf_internal;
import flash.utils.Dictionary;
use namespace rf_internal;
/**
* 维护即有字典又有顺序的数据,外部修改数据只能调用方法,不允许直接修改里面的数据
* @author crl
*
*/
public class ArraySet
{
private var _isListData:Boolean=true;
private var list:Array=[];
private var dic:Dictionary=new Dictionary(true);
/**
*
* @param isListData list里面存储的是data列表还是key列表
*
*/
public function ArraySet(isListData:Boolean=true)
{
_isListData=isListData;
}
public function set(key:*,data:*):void{
if(dic[key]){
remove(key);
}
if(data){
dic[key]=data;
if(_isListData){
list.push(data);
}else{
list.push(key);
}
}
}
public function remove(key:*):*
{
var data:*=dic[key];
if(data){
dic[key]=null;
delete dic[key];
var index:int;
if(_isListData){
index=list.indexOf(data);
}else{
index=list.indexOf(key);
}
if(index==-1){
throw new Error("数据结构有问题");
}
//必须有;
list.splice(index,1);
}
return data;
}
/**
* 以key来取它所在的索引;
* @param key
* @return
*
*/
public function indexOfKey(key:*):int{
if(_isListData==false){
return list.indexOf(key);
}
return list.indexOf(dic[key]);
}
/**
* 以data来取它所在的索引;
* @param data
* @return
*
*/
public function indexOfData(data:*):int{
if(_isListData){
return list.indexOf(data);
}
var len:int=list.length;
for(var key:* in dic){
if(dic[key]==data){
return list.indexOf(key);
}
}
return -1;
}
/**
* 以key取得数据;
* @param key
* @return
*
*/
public function get(key:*):*{
return dic[key];
}
public function clear():void{
dic=new Dictionary(true);
list.length=0;
}
public function dispose():void{
clear();
}
public function get length():int{
return list.length;
}
/**
* 取得复制的对像,这样里外的修改都不会影响原有的操作;
* @return
*
*/
public function getCloneList():Array
{
return list.concat();
}
public function getUnsafeList():Array
{
return list;//.concat();
}
public function getUnsafeDictionry():Dictionary
{
return dic;
}
}
}