Actionscript 3 如何在AS3中清理字典

Actionscript 3 如何在AS3中清理字典,actionscript-3,flash,Actionscript 3,Flash,在字典中清理所有关键引用是否有效 public static function cleanDic(_dic:Dictionary):void { for (var eachKey:String in _dic) { delete _dic[eachKey]; } } 我担心,如果在for循环期间删除某个键,将导致无法清除所有元素 这会发生吗 谢谢无需编写清理词典的方法。只需使用: yourdictionary = new Dictionary(); 垃

字典中清理所有关键引用是否有效

public static function cleanDic(_dic:Dictionary):void
{
    for (var eachKey:String in _dic)
    {
        delete _dic[eachKey];
    }
}
我担心,如果在
for
循环期间删除某个键,将导致无法清除所有元素

这会发生吗


谢谢

无需编写清理
词典的方法
。只需使用:

yourdictionary = new Dictionary();

垃圾收集器会起作用的。

我不太清楚你说的是什么意思

我担心的是,如果在for循环中删除某个键,将导致无法清除所有元素

但是您的代码示例是正确的,这就是清理
字典的方法。(假设您仅将
字典
对象与
字符串
键一起使用,因为
for
循环使用
字符串
。请参见下面的工程师评论。)

或者,您可以将字典设置为一个新实例,这样可以更快地实现相同的效果:

var dict:Dictionary = new Dictionary ();

... // use dict here      

dict = new Dictionary (); // effectively cleans the dictionary

然后闪存垃圾收集器应该释放字典中被丢弃的所有元素\uu首先,我不喜欢这里给出的任何答案。现在,让我们来解释一下:

  • 您的代码不会删除所有字典键,因为字典键可以是任何对象,而不是必需的字符串。因此,您需要迭代:

    for(键:字典中的对象)删除字典[key]

  • 当你不想创建一个新词典时,有很多合理的情况——创建一个新词典有时是一个很糟糕的替代品。例如,您在代码中的两个位置共享值(等等,为什么还要创建一个呢?)。创建新对象后,应通知代码中的位置,并以某种方式重新获得对新对象的新引用。因此,有时从字典中删除所有键,虽然计算效率不高,但与创建一个新键相比,效果会更好,因为这样可以使事情变得简单

  • 字典
    有一个有趣的方面。它实际上实现为两个哈希表,一个包含字符串键,另一个包含指针键(对象键)。不幸的是,这是由于糟糕的/未经深思熟虑的设计,而不是预期的。它有一个从
    对象继承的字符串哈希表和一个自己的指针键哈希表。通常不希望将字符串放入字典(或任何其他被隐式强制为字符串的内容,如数字或逻辑值),因此,当您发现自己在字典中使用字符串键时,请再想想,您可能希望使用
    对象

  • 在循环字典过程中会发生什么:在幕后创建了一个键集合,实际上,您在该集合上进行迭代。但是,由于字典的双重性质,两个键可能被视为同一个键(例如,如果您添加了字符串
    “1”
    和int
    1
    键-您将只获得其中一个键。删除键时,在不同的播放机版本中会出现不同的结果。在一些旧版本中,存在一个错误,即删除这些键并序列化字典后,其中一个键仍保留在其中。但是,同样,您应该避免使用字符串或数字作为密码钥匙


  • +1,但是“但是您的代码示例是正确的,这就是清理字典的方法”一点也不正确。
    字典
    的键不仅可以是
    字符串
    s,还可以是其他对象。因此
    var eachKey:String
    在代码中是不正确的。@Engineer-Oops,对不起,你是对的。我会在答案中解决这个问题。谢谢,我的意思是,如果我们使用对于(var i:int=0;i@Tunied这不应该是一个问题-可以在循环中删除任意数量的项。但是,如果使用循环计数器(
    i
    ),则必须从
    向量的末尾删除(使用
    i--
    )。如果向前删除(即使用
    i++
    ),您的循环计数器将增加,但您的元素计数将减少,当您尝试索引一个现在不存在的元素时,您将出现错误。)您好,谢谢您的建议,在我的情况下,我使用和字典存储一些将快速更改的元素。例如,在第一个勾号中,我将在(a、B、C)中设置一些元素,第二个勾号我需要首先清理字典,然后将其他元素推入(E,F,G)。这可能几乎每次勾号都会发生,所以在这种情况下,哪一种是最好的方法?每个勾号装入一个新字典或清理它?对于在对象内使用字典,我认为在字典中查询更快的是什么?(是这样吗?)再次感谢您的建议,当您说(在第3点下)“不想把字符串放入字典”时,请务必把这一点说清楚,你的意思是将字符串存储为值,还是将它们用作键?如果是后者,你能再详细说明一下吗?因为这就是我一直在做的事情,到目前为止还没有遇到任何问题。所以我很想知道这可能有什么问题。我认为这也值得一提-当你删除时迭代时字典中的键值对…它可能会产生不可预测的结果(例如保留一些未删除的项)。如果在向前迭代(i++)时从中删除元素,则将其视为数组/向量-您会将它们全部删除吗?可能不会。因此,我建议先收集密钥(使用类似于(var k:*在你的字典中)keys[keys.length]=k;
    然后在
    keys
    数组上迭代调用
    删除你的字典[keys[i];
    在你的字典元素上。它处理字符串和数字键的方式实际上非常奇怪。例如,
    dic[number(1)]=“string 1”
    会产生一个键类型“int”(通过getQualifiedClassName(key))。另一方面,
    dic[Number(-1)]=“string 1”;
    生成一个键类型为“string”。dic[“1”]生成一个“int”类型键,但dic[“1.”生成一个字符串键。这