2012-01-19 72 views
1

我正在測試HashMap implementation in AS3flex字典錯誤?

我曾嘗試下面的代碼:

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()方法:

map.clear(); 

HashMap中的大小沒有成爲0,但它是1。問題是,當密鑰是「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); 
    } 
} 

如果我再次調用clear()函數,其餘的按鍵將被刪除:

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

有誰知道是什麼原因Y鍵沒有按」噸被刪除?

回答

3

我還沒有時間去看看在狨(虛擬機閃存)的Dictionary實現,但似乎當值的remove被reaffected到地圖由線map[ key ] = undefined;字典是beeing改頭換面功能。

I.E.你開始用一組密鑰進行迭代,但隨後發生了重新映射,密鑰不再有效,虛擬機找不到前一個密鑰,因此在這種情況下會丟失y密鑰。

你可以做的是刪除map[key] = undefined;從remove功能,它應該工作。那是什麼奇怪的是,刪除沒有產生任何類似的錯誤...

要說明的是翻版發生在這裏看到一個活生生的例子: http://wonderfl.net/c/2PZT

你會看到一個關鍵是迭代時的兩倍您爲字典分配一個值。