1

所以根据这个讨论,没有固定时间的方法来获取 Dictionary 对象的大小。

我正在尝试实现一个添加此功能的包装器。没什么特别的——只是一个“numPairs”属性和重写的方法来保持更新。问题在于 [] 运算符用于添加键/值对,而不是命名方法,所以我不知道如何覆盖它以保持我的计数器更新。我可以做类似的事情...

public function addPair(key:*, val:*):void {
    this[key] = val;
    numPairs++;
}

...但如果我能保留括号表示法,那就太好了。有谁知道解决方案?

4

2 回答 2

2

如果你想保留括号表示法,你仍然可以使用Proxy类,包装一个真正的字典。这里是使用Proxy类的实现,但这里我没有使用弱字典,因为它可能会很棘手,因为“密钥”可能会被垃圾收集,而你不会意识到这一点。当然性能操作(添加,删除,...)也会低于真正的字典。

这里是现场测试:http ://wonderfl.net/c/dstz

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"]);
于 2012-09-14T10:57:08.540 回答
1

我了解您希望保留实际的对数,并且您还应该检查传递的未定义/空值是否表明已删除对。因此,您首先检查“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++;
        }
    }
}
于 2012-09-14T09:27:32.833 回答