HAKUHIN's home page
更新履歴
 
 



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プレイヤーのみ動作)
});
 
 



HAKUHIN's home page バナー http://hakuhin.jp/
(c) Hakuhin & 日新礼符 2002-2011 解像度1024×768以上 IE8.0以上推奨
/ 閲覧中: