2012-01-19 5 views
1

私はHashMap implementation in AS3をテストしていました。私は次のコードを試してみましたフレックス辞書のバグ?

:ハッシュマップのサイズが0になっていませんでしたが、それは1だった

map.clear(); 

var map:IMap = new HashMap(); 
map.put("a", "value A"); 
map.put("b", "value B"); 
map.put("c", "value C"); 
map.put("x", "value X"); 
map.put("y", "value Y"); 
map.put("z", "value Z"); 

は、それから私は、clear()メソッドを呼び出しました。問題は、キーが "y"のときに削除されないことです。次のように 対応するコードは次のとおりです。

protected var map:Dictionary = null; 

public function HashMap(useWeakReferences:Boolean = true) 
{ 
    map = new Dictionary(useWeakReferences); 
} 

public function put(key:*, value:*) : void 
{ 
    map[key] = value; 
} 

public function remove(key:*) : void 
{ 
    map[ key ] = undefined; 
    delete map[ key ]; 
} 

public function clear() : void 
{ 
    for (var key:* in map) 
    { 
     remove(key); 
    } 
} 

私は再びクリア()関数を呼び出した場合は、残りのキーは削除されます。

if (size() != 0) 
{ 
    clear(); 
} 

誰もがYキー「はdoesnの理由です何を知っています削除されますか?

答えて

3

私はタマリン(フラッシュ用VM)でDictionary実装を見て時間がなかったが、価値がremoveにラインmap[ key ] = undefined;でマップにreaffectedされたときに辞書を再ハッシュbeeingてされているようです関数。

I.E.あなたはキーのセットで反復を開始しますが、再ハッシュが発生し、キーはもはや有効ではなく、VMは前のキーを見つけることができないので、この場合はyキーがありません。

あなたができることは、map[key] = undefinedを削除することです。 remove関数から呼び出され、うまくいくはずです。あなたは鍵が二回時に反復されていることがわかります http://wonderfl.net/c/2PZT

:何それは奇妙なのは、削除を焼き直しはここに実際の例を参照してくださいが発生したことを示すために...

を任意の同様の不具合を生じなかったということです辞書に値を割り当てます。