Actionscript 3 AS3:为Dictionary类制作一个包装器,其中包含一个键/值对数计数器
因此,根据字典,没有固定时间的方法来获取字典对象的大小 我正在尝试实现一个添加此功能的包装器。没什么特别的-只是一个“numPairs”属性和重写的方法来保持更新。问题在于[]运算符用于添加键/值对,而不是命名方法,因此我不知道如何重写它以保持计数器的更新。我可以做一些像Actionscript 3 AS3:为Dictionary类制作一个包装器,其中包含一个键/值对数计数器,actionscript-3,dictionary,operator-overloading,wrapper,Actionscript 3,Dictionary,Operator Overloading,Wrapper,因此,根据字典,没有固定时间的方法来获取字典对象的大小 我正在尝试实现一个添加此功能的包装器。没什么特别的-只是一个“numPairs”属性和重写的方法来保持更新。问题在于[]运算符用于添加键/值对,而不是命名方法,因此我不知道如何重写它以保持计数器的更新。我可以做一些像 public function addPair(key:*, val:*):void { this[key] = val; numPairs++; } …但如果我能保留括号符号那就太好了。有人知道解决方案吗?
public function addPair(key:*, val:*):void {
this[key] = val;
numPairs++;
}
…但如果我能保留括号符号那就太好了。有人知道解决方案吗?我知道您希望保留实际对计数,并且您还应该检查传递的未定义/空值是否表示删除了对。所以,首先检查“this”中是否有键,然后赋值
public function addPair(key:String, val:*):void {
if (this[key]) {
// pair exists, updating
this[key]=val;
if (!val) numPairs--;
} else {
// pair does not exist, adding
if (val) {
this[key]=val;
numPairs++;
}
}
}
如果你想保留括号符号,你仍然可以使用这个类,包装一个真正的字典。 这里是一个使用类的实现,但这里我没有使用弱字典,因为它可能很棘手,因为“键”可能会被垃圾收集,而您不会意识到这一点。当然,性能操作(添加、删除等)也将低于真正的字典 以下是现场测试:
只是好奇,为什么长度很重要?为什么不在这个例子中使用数组或向量呢?我用它来在游戏板上存储物品,我需要能够根据键(方格上的位置)快速访问它们,并且知道我在板上的其他物品的数量。谢谢!这正是我想要的。我很好奇为什么你提到了性能差异——你是指增加_大小的额外操作,以及通过包装器的额外函数调用吗?还是我遗漏了什么?@Patrick“当然,性能操作(添加、删除等)也会比真正的字典低。”低多少?我正在考虑做一些类似于Dictionary子类的事情,Dictionary子类不断地被告知在任何特定的时刻找出它的键,并在函数调用中返回它们。如果我这样做会更快吗,除了维护密钥集合而不是每次都迭代,而不仅仅是计数?您的实现将只将密钥保存为字符串或QName对象。用严格的对等检查是不可能写出词典的。在您的示例中,
dict[0]
将产生一个键“0”。表示dict[0]==dict[“0”]
import flash.utils.Dictionary;
import flash.utils.Proxy;
import flash.utils.flash_proxy;
public class MyDict extends Proxy {
private var _size:int = 0;
private var _dict:Dictionary = new Dictionary();
public function get size():int {
return _size;
}
flash_proxy override function getProperty(name:*):* {
return _dict[name];
}
flash_proxy override function setProperty(name:*, value:*):void {
if (!_dict.hasOwnProperty(name))
_size ++;
_dict[name] = value;
}
flash_proxy override function deleteProperty(name:*):Boolean {
if (_dict.hasOwnProperty(name)) {
_size --;
delete _dict[name];
return true;
}
return false;
}
}
var dict:MyDict = new MyDict();
dict[1] = 2;
dict["foo"] = "bar";
trace(dict.size, dict[1], dict["foo"]);
delete dict[1];
trace(dict.size, dict[1], dict["foo"]);