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