1
4
5
38 class org.aswing.utils.HashMap{
39
40 private var length:Number;
41 private var content:Object;
42 private var keyContent:Object;
43 private var noneStringKeys:Array;
44 private var noneStringMapedValues:Array;
45
46
47 public function HashMap(){
48 length = 0;
49 content = new Object();
50 keyContent = new Object();
51 noneStringKeys = new Array();
52 noneStringMapedValues = new Array();
53 }
54
55
56
57
60 public function size():Number{
61 return length;
62 }
63
64
67 public function isEmpty():Boolean{
68 return (length==0);
69 }
70
71
74 public function keys():Array{
75 var temp:Array = new Array(length);
76 var index:Number = 0;
77 for(var i:String in keyContent){
78 temp[index] = keyContent[i];
79 index++;
80 }
81 for(var i:Number=0; i<noneStringKeys.length; i++){
82 temp[index+i] = noneStringKeys[i];
83 }
84 return temp;
85 }
86
87
90 public function values():Array{
91 var temp:Array = new Array(length);
92 var index:Number = 0;
93 for(var i:String in content){
94 temp[index] = content[i];
95 index++;
96 }
97 for(var i:Number=0; i<noneStringMapedValues.length; i++){
98 temp[index+i] = noneStringMapedValues[i];
99 }
100 return temp;
101 }
102
103 private function isStringKey(key):Boolean{
104 return (typeof(key) == "string" || key instanceof String);
105 }
106
107 private function indexOfKey(key):Number{
108 for(var i:Number=0; i<noneStringKeys.length; i++){
109 if(key === noneStringKeys[i]){
110 return i;
111 }
112 }
113 return -1;
114 }
115
116 private function indexOfValue(value):Number{
117 for(var i:Number=0; i<noneStringMapedValues.length; i++){
118 if(value === noneStringMapedValues[i]){
119 return i;
120 }
121 }
122 return -1;
123 }
124
125
129 public function containsValue(value):Boolean{
130 for(var i:String in content){
131 if(content[i] === value){
132 return true;
133 }
134 }
135 if(indexOfValue(value) >= 0){
136 return true;
137 }
138 return false;
139 }
140
141
147 public function containsKey(key):Boolean{
148 if(isStringKey(key)){
149 if(content[key] != undefined){
150 return true;
151 }
152 }else{
153 if(indexOfKey(key) >= 0){
154 return true;
155 }
156 }
157 return false;
158 }
159
160
169 public function get(key){
170 if(isStringKey(key)){
171 var value = content[key];
172 if(value !== undefined){
173 return value;
174 }
175 }else{
176 var index:Number = indexOfKey(key);
177 if(index >= 0){
178 return noneStringMapedValues[index];
179 }
180 }
181 return null;
182 }
183
184
195 public function put(key, value){
196 if(key == undefined){
197 trace("cannot put a value with undefined or null key!");
198 return undefined;
199 }else{
200 var exist:Boolean = containsKey(key);
201 if(!exist){
202 length++;
203 }
204 var oldValue = this.get(key);
205 if(isStringKey(key)){
206 content[key]=value;
207 keyContent[key]=key;
208 }else{
209 if(!exist){
210 noneStringKeys.push(key);
211 noneStringMapedValues.push(value);
212 }else{
213 var index:Number = indexOfKey(key);
214 noneStringKeys[index] = key;
215 noneStringMapedValues[index] = value;
216 }
217 }
218 return oldValue;
219 }
220 }
221
222
231 public function remove(key){
232 var exist:Boolean = containsKey(key);
233 if(!exist){
234 return null;
235 }
236 var temp;
237 if(isStringKey(key)){
238 temp=content[key];
239 delete content[key];
240 delete keyContent[key];
241 }else{
242 var index:Number = indexOfKey(key);
243 temp = noneStringMapedValues[index];
244 noneStringKeys.splice(index, 1);
245 noneStringMapedValues.splice(index, 1);
246 }
247 length--;
248 return temp;
249 }
250
251
255 public function putArray(Arr:Array, key:String):Void{
256 for(var i:Number=0; i<Arr.length; i++){
257 put(key+i, Arr[i]);
258 }
259 }
260
261
264 public function clear():Void{
265 length = 0;
266 content = new Object();
267 keyContent = new Object();
268 noneStringKeys = new Array();
269 noneStringMapedValues = new Array();
270 }
271
272
275 public function clone():HashMap{
276 var temp:HashMap = new HashMap();
277 for(var i:String in content){
278 temp.put(keyContent[i], content[i]);
279 }
280 for(var i:Number=0; i<noneStringKeys.length; i++){
281 temp.put(noneStringKeys[i], noneStringMapedValues[i]);
282 }
283 return temp;
284 }
285
286 public function toString():String{
287 var ks:Array = keys();
288 var vs:Array = values();
289 var temp:String = "HashMap Content:\n";
290 for(var i:Number=0; i<ks.length; i++){
291 temp += ks[i]+" -> "+vs[i] + "\n";
292 }
293 return temp;
294 }
295 }
296