Actionscript 3 AS3:为Dictionary类制作一个包装器,其中包含一个键/值对数计数器

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++; } …但如果我能保留括号符号那就太好了。有人知道解决方案吗?

因此,根据字典,没有固定时间的方法来获取字典对象的大小

我正在尝试实现一个添加此功能的包装器。没什么特别的-只是一个“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"]);