Dictionary クラスについて
Dictionary クラスについて
■Dictionaryクラスについて
Dictionary クラスは、データをコレクションする為の機能がまとまっています。
何らかの「キー」を利用して、「データ」を登録、取得、削除する事ができます。
■Dictionary クラスと Oject クラスの違い
Dictionary クラス は、Object クラス と似ています。
Object クラスは、「プロパティ名」をキーとして使用して、データへのアクセスができます。
Dictionary クラスは、「プロパティ名」に加えて「オブジェクト」をキーとして使用して、データへのアクセスができます。
まず Object クラス の特性について見てみましょう。
Object クラスでデータを管理する
■Object を使ったデータの管理
Object は、基本的に "."(ドット)とプロパティ名称を使ってアクセスする事ができます。
[ ] カッコを使用してアクセスする事もできます。
数値や文字列を使って、プロパティ名称を一致させる事ができれば、そのプロパティに動的にアクセスできます。
プロパティ名称を使用して、データを登録、取得、削除する例を見てみます。
■Object にプロパティを追加してデータを格納する
プロパティを追加してデータを格納する例です。
Object にプロパティを追加してデータを格納する
var obj : Object = new Object();
obj.a = 123;
obj.b = "abc";
obj["c"] = 456;
obj[0] = "def";
■Object からデータを取得する
プロパティを指定してデータを取得する例です。
Object に格納したデータを取得する
var obj : Object = new Object();
obj.a = 123;
obj.b = "abc";
obj["c"] = 456;
obj[0] = "def";
trace(obj.a);
trace(obj.b);
trace(obj["c"]);
trace(obj[0]);
■Object からプロパティを削除する
プロパティを削除する例です。
delete 命令を使用すると、プロパティを削除する事ができます。
Object からプロパティを削除する
var obj : Object = new Object();
obj.a = 123;
obj.b = "abc";
obj["c"] = 456;
obj[0] = "def";
delete obj.a;
delete obj["c"];
trace(obj.a);
trace(obj.b);
trace(obj["c"]);
trace(obj[0]);
■[ ] カッコを使用してプロパティを指定した際の挙動について
プロパティ名は、データを別々な物としてアクセスするためのキーとなります。
「数値としてキーを指定した場合」と、「文字列としてキーを指定した場合」に、最終的に名称一致するものは同一のキーとして扱われます。
以下のように、数値や文字を指定してアクセスを試みた場合、最終的なアクセス先のプロパティは同じです。
Object からデータを取り出す
var obj : Object = new Object();
obj.[123] = "abc";
trace(obj.[123]);
trace(obj.["123"]);
また、Object 型の変数をキーとして指定した場合も同様です。
Object 型の変数を指定した場合、 toString() メソッドで得られる文字列がキーとして使用されます。最終的に名称一致するものは同一のキーとして扱われます。
以下のように、Object や文字を指定してアクセスを試みた場合、最終的なアクセス先のプロパティは同じです。
Object型のプロパティに Object を指定した場合、toString() メソッドで得られる文字列として処理される
var obj : Object = new Object();
var o : Object = new Object();
var s = String(o);
trace("str : " + s);
obj[o] = "abc";
trace(obj[s]);
trace(obj[o]);
trace(obj["[object Object]"]);
Object型のプロパティに Object を指定した場合、toString() メソッドで得られる文字列として処理される
var obj : Object = new Object();
var o : Object = new Object();
o.toString = function():String {
return "obj_key";
};
var s = String(o);
trace("str : " + s);
obj[o] = "abc";
trace(obj[s]);
trace(obj[o]);
trace(obj["obj_key"]);
Dictionary クラスでデータを管理する
■Dictionary を使ったデータの管理
Dictionary クラスは、 Object クラスと同様に、
基本的に "."(ドット)とプロパティ名称を使ってアクセスする事ができます。
[ ] カッコを使用してアクセスする事もできます。
数値や文字列を使って、プロパティ名称を一致させる事ができれば、そのプロパティに動的にアクセスできます。
■オブジェクトキーを使用してアクセスする
さらに、[ ] カッコには、オブジェクトやインスタンスを指定する事もできます。オブジェクトを指定した場合、プロパティ名称ではアクセスできません。
オブジェクトを使ったアクセスを、「オブジェクトキー」と呼ぶ事にします。
ここでは、オブジェクトキーを使用して、データを登録、取得、削除する例を見てみます。
■Dictionary にオブジェクトキーを追加してデータを格納する
オブジェクトキーを追加してデータを格納する例です。
Dictionary にオブジェクトキーを追加してデータを格納する
var dic : Dictionary = new Dictionary();
var ary : Array = new Array();
var obj : Object = new Object();
dic[ary] = "あいうえお";
dic[obj] = "かきくけこ";
■Dictionary からデータを取得する
オブジェクトキーを指定してデータを取得する例です。
Dictionary に格納したデータを取得する
var dic : Dictionary = new Dictionary();
var ary : Array = new Array();
var obj : Object = new Object();
dic[ary] = "あいうえお";
dic[obj] = "かきくけこ";
trace(dic[ary]);
trace(dic[obj]);
■Dictionary からオブジェクトキーを削除する
オブジェクトキーを削除する例です。
delete 命令を使用すると、オブジェクトキーを削除する事ができます。
キーとして使用したオブジェクト自体は消滅しません。
Object からプロパティを削除する
var dic : Dictionary = new Dictionary();
var ary : Array = new Array();
var obj : Object = new Object();
dic[ary] = "あいうえお";
dic[obj] = "かきくけこ";
delete dic[ary];
trace(dic[ary]);
trace(dic[obj]);
■ユニーク(唯一)であるかを調べる
Dictionary に沢山のオブジェクトを登録したい事があります。そして任意のデータがすでに Dictionary に登録済みかを調べたいとします。
この場合、オブジェクトキーとしてオブジェクト自身の参照を利用すれば、簡単に登録済みであるかを調べる事ができます。
スプライトをクリックする度に Dictionary に登録する例です。
初回登録であるか、すでに登録済みであるかを trace() 関数で出力します。
クリックされたスプライトを Dictionary に登録する
import flash.display.Sprite;
import flash.text.TextField;
var dic : Dictionary = new Dictionary();
var i:int;
var num:int = 100;
for(i=0;i < num;i++){
var sprite:Sprite = new Sprite();
addChild(sprite);
sprite.x = Math.random() * 550;
sprite.y = Math.random() * 400;
sprite.name = "sprite" + i;
sprite.graphics.beginFill (Math.floor(Math.random() * 0xFFFFFFFF), 1.0);
sprite.graphics.drawCircle ( 0 , 0, 20 );
var tf:TextField = new TextField();
tf.selectable = false;
tf.width = 50;
tf.height = 30;
tf.text = "" + i;
sprite.addChild(tf);
sprite.addEventListener(MouseEvent.MOUSE_DOWN,function(e:MouseEvent):void{
var s:Sprite = e.currentTarget as Sprite;
// オブジェクトキーに自身の参照を使用してデータが存在するか調べる
if(dic[s]){
trace(s.name + " は登録済みです。");
}else{
trace(s.name + " を登録します。");
}
// オブジェクトキーに自身の参照を使用してデータを登録
dic[s] = s;
});
}
オブジェクトキーに弱参照を使用する
■オブジェクトキーに弱参照を使用する
Dictionary クラスをインスタンス化する際に、引数に true を指定する事で利用できます。
Dictionary オブジェクトを弱参照で作成
// オブジェクトキーが弱参照となる Dictionary オブジェクトを作成
var dic:Dictionary = new Dictionary(true);
Dictionary にアクセスする為のキーとしてオブジェクトを使用した場合、そのオブジェクトを弱参照で管理する事ができます。
オブジェクトがどこからも参照されていない場合、ガベージコレクションの対象となります。
オブジェクトをキーとしてデータを登録する
// オブジェクトキーが弱参照となる Dictionary オブジェクトを作成
var dic:Dictionary = new Dictionary(true);
// オブジェクトを作成
var key:Object = new Object();
// オブジェクトキーを使ってデータを登録
dic[key] = "あいうえお";
オブジェクトが、ガベージコレクションにより消滅した場合、
Dictionary に登録したオブジェクトキーも同時に消滅します。
オブジェクトをキーとしてデータを登録する
// オブジェクトキーが弱参照となる Dictionary オブジェクトを作成
var dic:Dictionary = new Dictionary(true);
// オブジェクトを作成
var key:Object = new Object();
// オブジェクトをキーにしてデータを登録
dic[key] = "あいうえお";
// オブジェクトをガベージコレクション対象にする
key = null;
テスト例です。
Dictionary にアクセスする為のキーとしてオブジェクトを使用します。
そのオブジェクトが、ガベージコレクションにより消滅した際にオブジェクトキーも消滅するか調べます。
Dictionary オブジェクトを弱参照で作成し、ガベージコレクション対象のデータを監視する
// オブジェクトキーが弱参照となる Dictionary オブジェクトを作成
var dic:Dictionary = new Dictionary(true);
// キーとして使用するオブジェクト
var ary:Array = new Array();
var obj:Object = new Object();
// オブジェクトキーを追加してデータを登録
dic[ary] = "abc";
dic[obj] = "def";
// オブジェクトキーとデータが存在するかチェック
addEventListener(Event.ENTER_FRAME,function(e:Event):void{
trace("---");
for(var p:Object in dic){
trace("p:" + p + " data:" + dic[p]);
}
});
// クリックしたらガベージコレクション対象へ
stage.addEventListener(MouseEvent.MOUSE_DOWN,function(e:Event):void{
ary = null;
obj = null;
//System.gc(); // 強制ガベージコレクション(Debugプレイヤーのみ動作)
});
