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

実際のペア数を維持したいというご要望を承りました。また、ペアの削除を示す undefined/null 値が渡されていないかどうかも確認する必要があります。したがって、最初に「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 に答える