Flashゲームプログラミング講座 for ActionScript3.0

 

Dictionary クラスについて

 


■Dictionaryクラスについて


Dictionary クラス は、連想配列のクラスです。
 
特に、辞書としての利用に最適です。
 
Dictionary クラスは、データをコレクションする機能がまとまっています。
 
キーを利用して、任意のデータを追加、取得、除外する事ができます。
 
キーとは、任意のデータにアクセスするための、ユニーク(唯一)な識別情報です。
 
■Dictionary クラスと Oject クラスの違い
 
Dictionary クラス は、Object クラスと似ています。
 
Object クラスは、プロパティ名(文字列)のみを、キーとして利用する事ができます。
 
Dictionary クラスは、さらにオブジェクトの参照も、キーとして利用する事ができます。
 
■辞書としての特性について
 
Dictionary クラスは、内部でハッシュテーブルを使った高速化が実現されています
 
キーを識別情報にして、該当するデータを高速で検索する事ができます。
 
また、すべてのデータの中から該当するデータが存在しない事を、高速で判別する事もできます。
 
データの総数が、100 万以上ある場合でも、瞬時に検索できます。
 
 

 

Dictionary クラスについて

 
 


■Dictionary オブジェクトを作成する

 
new 演算子を使って、Dictionary クラスをインスタンス化します。
 
第01引数の、弱参照については、こちらで解説しています。
 
new Dictionary ( 弱参照を利用するか? ) :Dictionary
第01引数(略可)Boolean弱参照を利用する場合 true。強参照を利用する場合 false。デフォルトは false
戻り値 DictionaryDictionary オブジェクトが得られる。
 
Dictionary オブジェクトを作成する

import flash.utils.Dictionary;

// ------------------------------------------------------------
// Dictionary オブジェクトを作成
// ------------------------------------------------------------
var dictionary : Dictionary = new Dictionary();

// 出力テスト
trace(dictionary);
 

■プロパティ名を使ってデータを管理する

 
プロパティ名(文字列)を使って、データを管理するには、以下の方法があります。
 
これは、Object のプロパティと同等です。
 
■ドットアクセス演算子を使用する
 
ドットアクセス演算子は、Dictionary.キー と記述します。
 
キーの名称は、変数の命名規則に従う必要があります。
 
Dictionary オブジェクトに、データを追加する(ドットアクセス演算子)

import flash.utils.Dictionary;

// ------------------------------------------------------------
// Dictionary オブジェクトを作成
// ------------------------------------------------------------
var dictionary : Dictionary = new Dictionary();

// ------------------------------------------------------------
// データを格納する
// ------------------------------------------------------------
dictionary.aaa = 123;
dictionary.bbb = "abc";

// ------------------------------------------------------------
// 出力テスト
// ------------------------------------------------------------
trace(dictionary.aaa); // 123
trace(dictionary.bbb); // "abc"
 
■配列アクセス演算子を使用する
 
配列アクセス演算子は、Dictionary["キー"] と記述します。
 
キーの名称は、変数の命名規則に従う必要はありません。
 
配列アクセス演算子を使用すると、プロパティ名の指定を動的に制御する事ができます。
 
Dictionary オブジェクトに、データを追加する(配列アクセス演算子)

import flash.utils.Dictionary;

// ------------------------------------------------------------
// Dictionary オブジェクトを作成
// ------------------------------------------------------------
var dictionary : Dictionary = new Dictionary();

// ------------------------------------------------------------
// データを格納する
// ------------------------------------------------------------
dictionary["添字"] = 456;
dictionary[0] = "def";

// ------------------------------------------------------------
// 出力テスト
// ------------------------------------------------------------
trace(dictionary["添字"]); // 456
trace(dictionary[0]); // "def"
 

■オブジェクトキーを使ってデータを管理する

 
Dictionary クラスでは、オブジェクトの参照を、キーとして使用することができます。
 
これを、オブジェクトキーといいます。
 
オブジェクトの参照を、キーとして使用するには、配列アクセス演算子を使用します。
 
[ ] 角括弧の中に、オブジェクトを指定します。
 
Dictionary オブジェクトに、データを追加する(オブジェクトキー)

import flash.utils.Dictionary;

// ------------------------------------------------------------
// Dictionary オブジェクトを作成
// ------------------------------------------------------------
var dictionary: Dictionary = new Dictionary();

// ------------------------------------------------------------
// オブジェクトを作成
// ------------------------------------------------------------
var ary : Array = new Array();
var obj : Object = new Object();

// ------------------------------------------------------------
// データを格納する
// ------------------------------------------------------------
dictionary[ary] = "あいうえお";
dictionary[obj] = "かきくけこ";

// ------------------------------------------------------------
// 出力テスト
// ------------------------------------------------------------
trace(dictionary[ary]); // "あいうえお"
trace(dictionary[obj]); // "かきくけこ"
 

■オブジェクトキーの弱参照について

 
■オブジェクトキーの弱参照について
 
Dictionary コンストラクタの第01引数に、true を指定すると、弱参照となります。
 
この設定は、オブジェクトキーを利用している場合に、効果があります。
 
オブジェクトキーが弱参照となる、Dictionary オブジェクトを作成

import flash.utils.Dictionary;

// ------------------------------------------------------------
// オブジェクトキーが弱参照となる、Dictionary オブジェクトを作成
// ------------------------------------------------------------
var dictionary:Dictionary = new Dictionary(true);

// 出力テスト
trace(dictionary);
 
■弱参照指定時の動作について
 
キーとして使用したオブジェクトが、どこからも参照されなくなった場合、ガベージコレクションの対象となります。
 
ガベージコレクションが実行され、オブジェクトが消滅した場合、格納したデータも消滅します。
 
オブジェクトキーが消滅した場合、格納したデータも消滅するか確認する

import flash.utils.Dictionary;
import flash.system.System;
import flash.utils.Timer;
import flash.events.TimerEvent;

// ------------------------------------------------------------
// オブジェクトキーが弱参照となる Dictionary オブジェクトを作成
// ------------------------------------------------------------
var dictionary:Dictionary = new Dictionary(true);

// ------------------------------------------------------------
// オブジェクトを作成
// ------------------------------------------------------------
var obj:Object = new Object();

// ------------------------------------------------------------
// データを格納する
// ------------------------------------------------------------
dictionary[obj] = "あいうえお";

// ------------------------------------------------------------
// オブジェクトキーへの参照を断つ(ガベージコレクションが発生すると、格納したデータも連動して消滅する)
// ------------------------------------------------------------
obj = null;

// ------------------------------------------------------------
// ガベージコレクションを実行 (Debug 版プレイヤーか Adobe AIR でのみ動作)
// ------------------------------------------------------------
System.gc();

// ------------------------------------------------------------
// 1秒後に実行する
// ------------------------------------------------------------
var timer:Timer = new Timer(1000,1);
timer.addEventListener(TimerEvent.TIMER_COMPLETE,function (e:TimerEvent):void{

	// ------------------------------------------------------------
	// 出力テスト
	// ------------------------------------------------------------
	var key:*;
	for(key in dictionary){
		trace(dictionary[key]);
	}

});
timer.start();
 
■弱参照の使用例について
 
キーとなるオブジェクトが、自動的に消滅する場合に最適です。
 
破棄処理が、不要になります。
 
例えば、表示オブジェクトを、外部から管理する場合に便利でしょう。
 
表示オブジェクトは、タイムラインが移動すると自動的に消滅する事があります。
 
表示オブジェクトをキーにして、任意の付随データを格納します。
 
任意の表示オブジェクトの参照があれば、付随データを取得できます。
 
付随データが存在しない事を、瞬時に調べる事もできます。
 
すべてのデータは、1つの Dictionary オブジェクト内に格納されます。
 
表示オブジェクトに、データを保持させる必要はありません。
 
表示オブジェクト内が、汚染する事はありません。
 
表示オブジェクトが消滅した場合、付随データも連動して消滅します。
 
表示オブジェクトが除去されたかを、わざわざ監視する必要はありません。
 
イベントリスナーの、コールバック関数内で使用する例は、こちらです。
 
 

 

データを追加する

 
 


■プロパティ名を使って、データを追加する

 
プロパティ名を使って、Dictionary オブジェクトに、データを追加する例です。
 
ドットアクセス演算子や、配列アクセス演算子を使用する事ができます。
 
Dictionary オブジェクトに、データを追加する(ドットアクセス演算子)

import flash.utils.Dictionary;

// ------------------------------------------------------------
// Dictionary オブジェクトを作成
// ------------------------------------------------------------
var dictionary : Dictionary = new Dictionary();

// ------------------------------------------------------------
// データを格納する
// ------------------------------------------------------------
dictionary.aaa = 123;
dictionary.bbb = "abc";

// ------------------------------------------------------------
// 出力テスト
// ------------------------------------------------------------
trace(dictionary.aaa); // 123
trace(dictionary.bbb); // "abc"
 
Dictionary オブジェクトに、データを追加する(配列アクセス演算子)

import flash.utils.Dictionary;

// ------------------------------------------------------------
// Dictionary オブジェクトを作成
// ------------------------------------------------------------
var dictionary : Dictionary = new Dictionary();

// ------------------------------------------------------------
// データを格納する
// ------------------------------------------------------------
dictionary["添字"] = 456;
dictionary[0] = "def";

// ------------------------------------------------------------
// 出力テスト
// ------------------------------------------------------------
trace(dictionary["添字"]); // 456
trace(dictionary[0]); // "def"
 

■オブジェクトキーを使って、データを追加する

 
オブジェクトキーを使って、Dictionary オブジェクトに、データを追加する例です。
 
配列アクセス演算子を使用します。
 
Dictionary オブジェクトに、データを追加する(オブジェクトキー)

import flash.utils.Dictionary;

// ------------------------------------------------------------
// Dictionary オブジェクトを作成
// ------------------------------------------------------------
var dictionary : Dictionary = new Dictionary();

// ------------------------------------------------------------
// オブジェクトを作成
// ------------------------------------------------------------
var obj:Object = new Object();
var ary:Array = new Array();

// ------------------------------------------------------------
// データを格納する
// ------------------------------------------------------------
dictionary[obj] = 789;
dictionary[ary] = "ghi";

// ------------------------------------------------------------
// 出力テスト
// ------------------------------------------------------------
trace(dictionary[obj]); // 789
trace(dictionary[ary]); // "ghi"
 


 

データを取得する

 
 


■プロパティ名を使って、データを取得する

 
プロパティ名を使って、Dictionary オブジェクトから、データを取得する例です。
 
ドットアクセス演算子や、配列アクセス演算子を使用する事ができます。
 
Dictionary オブジェクトから、データを取得する(ドットアクセス演算子)

import flash.utils.Dictionary;

// ------------------------------------------------------------
// Dictionary オブジェクトを作成
// ------------------------------------------------------------
var dictionary : Dictionary = new Dictionary();

// ------------------------------------------------------------
// データを格納する
// ------------------------------------------------------------
dictionary.aaa = 123;
dictionary.bbb = "abc";

// ------------------------------------------------------------
// データを取得する
// ------------------------------------------------------------
var a:Number = dictionary.aaa;
var b:String = dictionary.bbb;

// ------------------------------------------------------------
// 出力テスト
// ------------------------------------------------------------
trace(a); // 123
trace(b); // "abc"
 
Dictionary オブジェクトから、データを取得する(配列アクセス演算子)

import flash.utils.Dictionary;

// ------------------------------------------------------------
// Dictionary オブジェクトを作成
// ------------------------------------------------------------
var dictionary : Dictionary = new Dictionary();

// ------------------------------------------------------------
// データを格納する
// ------------------------------------------------------------
dictionary["添字"] = 456;
dictionary[0] = "def";

// ------------------------------------------------------------
// データを取得する
// ------------------------------------------------------------
var a:Number = dictionary["添字"];
var b:String = dictionary[0];

// ------------------------------------------------------------
// 出力テスト
// ------------------------------------------------------------
trace(a); // 456
trace(b); // "def"
 

■オブジェクトキーを使って、データを取得する

 
オブジェクトキーを使って、Dictionary オブジェクトから、データを取得する例です。
 
配列アクセス演算子を使用します。
 
Dictionary オブジェクトから、データを取得する(オブジェクトキー)

import flash.utils.Dictionary;

// ------------------------------------------------------------
// Dictionary オブジェクトを作成
// ------------------------------------------------------------
var dictionary : Dictionary = new Dictionary();

// ------------------------------------------------------------
// オブジェクトを作成
// ------------------------------------------------------------
var obj:Object = new Object();
var ary:Array = new Array();

// ------------------------------------------------------------
// データを格納する
// ------------------------------------------------------------
dictionary[obj] = 789;
dictionary[ary] = "ghi";

// ------------------------------------------------------------
// データを取得する
// ------------------------------------------------------------
var a:Number = dictionary[obj];
var b:String = dictionary[ary];

// ------------------------------------------------------------
// 出力テスト
// ------------------------------------------------------------
trace(a); // 789
trace(b); // "ghi"
 

■すべてのデータを順番に取得する

 
■ for..in 文を使用する
 
for..in 文を使って、アクセスする例です。
 
プロパティ名や、オブジェクトキーを取得できます。
 
配列アクセス演算子を使ってデータにアクセスします。
 
for..in 文を使用して、すべてのデータにアクセスする

import flash.utils.Dictionary;

// ------------------------------------------------------------
// Dictionary オブジェクトを作成
// ------------------------------------------------------------
var dictionary : Dictionary = new Dictionary();

// ------------------------------------------------------------
// オブジェクトを作成
// ------------------------------------------------------------
var obj:Object = new Object();

// ------------------------------------------------------------
// データを格納する
// ------------------------------------------------------------
dictionary.aaa = "あいうえお";
dictionary["添字"] = "かきくけこ";
dictionary[obj] = "さしすせそ";

// ------------------------------------------------------------
// for..in 文を使用して、すべてのデータにアクセスする
// ------------------------------------------------------------
var key:*;
for (key in dictionary){
	trace("---");
	trace("key:" + key);
	trace("data:" + dictionary[key]);
}
 
■ for each..in 文を使用する
 
for each..in 文を使って、アクセスする例です。
 
データを直接取得することができます。
 
for each..in 文を使用して、すべてのデータにアクセスする

import flash.utils.Dictionary;

// ------------------------------------------------------------
// Dictionary オブジェクトを作成
// ------------------------------------------------------------
var dictionary : Dictionary = new Dictionary();

// ------------------------------------------------------------
// オブジェクトを作成
// ------------------------------------------------------------
var obj:Object = new Object();

// ------------------------------------------------------------
// データを格納する
// ------------------------------------------------------------
dictionary.aaa = "あいうえお";
dictionary["添字"] = "かきくけこ";
dictionary[obj] = "さしすせそ";

// ------------------------------------------------------------
// for each..in 文を使用して、すべてのデータにアクセスする
// ------------------------------------------------------------
var data:*;
for each (data in dictionary){
	trace(data);
}
 


 

データを除外する

 
 


■プロパティ名を使って、データを除外する

 
delete 文を使用すると、プロパティを削除する事ができます。
 
Dictionary オブジェクトから、プロパティを削除する例です。
 
Dictionary からプロパティを削除する(ドットアクセス演算子)

import flash.utils.Dictionary;

// ------------------------------------------------------------
// Dictionary オブジェクトを作成
// ------------------------------------------------------------
var dictionary : Dictionary = new Dictionary();

// ------------------------------------------------------------
// データを格納する
// ------------------------------------------------------------
dictionary.aaa = 123;
dictionary.bbb = "abc";

// ------------------------------------------------------------
// データを除外する
// ------------------------------------------------------------
delete dictionary.aaa;

// ------------------------------------------------------------
// 出力テスト
// ------------------------------------------------------------
trace(dictionary.aaa); // undefined
trace(dictionary.bbb); // "abc"
 
Dictionary からプロパティを削除する(配列アクセス演算子)

import flash.utils.Dictionary;

// ------------------------------------------------------------
// Dictionary オブジェクトを作成
// ------------------------------------------------------------
var dictionary : Dictionary = new Dictionary();

// ------------------------------------------------------------
// データを格納する
// ------------------------------------------------------------
dictionary["添字"] = 456;
dictionary[0] = "def";

// ------------------------------------------------------------
// データを除外する
// ------------------------------------------------------------
delete dictionary["添字"];

// ------------------------------------------------------------
// 出力テスト
// ------------------------------------------------------------
trace(dictionary["添字"]); // undefined
trace(dictionary[0]); // "def"
 

■オブジェクトキーを使って、データを除外する

 
delete 文を使用すると、プロパティを削除する事ができます。
 
Dictionary オブジェクトから、プロパティを削除する例です。
 
Dictionary オブジェクトから、データを除外する(オブジェクトキー)

import flash.utils.Dictionary;

// ------------------------------------------------------------
// Dictionary オブジェクトを作成
// ------------------------------------------------------------
var dictionary : Dictionary = new Dictionary();

// ------------------------------------------------------------
// オブジェクトを作成
// ------------------------------------------------------------
var obj:Object = new Object();
var ary:Array = new Array();

// ------------------------------------------------------------
// データを格納する
// ------------------------------------------------------------
dictionary[obj] = 789;
dictionary[ary] = "ghi";

// ------------------------------------------------------------
// データを除外する
// ------------------------------------------------------------
delete dictionary[obj];

// ------------------------------------------------------------
// 出力テスト
// ------------------------------------------------------------
trace(dictionary[obj]); // undefined
trace(dictionary[ary]); // "ghi"
 
Dictionary オブジェクトから、データを除外する(オブジェクトキーの弱参照)

import flash.utils.Dictionary;
import flash.system.System;
import flash.utils.setTimeout;

// ------------------------------------------------------------
// Dictionary オブジェクトを作成(弱参照)
// ------------------------------------------------------------
var dictionary : Dictionary = new Dictionary(true);

// ------------------------------------------------------------
// オブジェクトを作成
// ------------------------------------------------------------
var obj:Object = new Object();
var ary:Array = new Array();

// ------------------------------------------------------------
// データを格納する
// ------------------------------------------------------------
dictionary[obj] = 789;
dictionary[ary] = "ghi";

// ------------------------------------------------------------
// オブジェクトキーへの参照を断つ
// ------------------------------------------------------------
obj = null;

// ------------------------------------------------------------
// ガベージコレクションを実行 (Debug 版プレイヤーか Adobe AIR でのみ動作)
// ------------------------------------------------------------
System.gc();

// ------------------------------------------------------------
// 1 秒後に実行される関数
// ------------------------------------------------------------
setTimeout(function () :void{

	// ------------------------------------------------------------
	// 出力テスト
	// ------------------------------------------------------------
	var key:*;
	for(key in dictionary){
		trace(dictionary[key]);
	}

},1000);