OutSystemsでハッシュテーブルを利用する方法を説明します。
ハッシュテーブルは、キーと値の組み合わせを格納していくデータ構造です。
Listだと、整数のインデックスに対してList変数ごとに決まった値を格納できます。
これに対して、ハッシュテーブルでは、Text型のインデックスに対して、Object型の値を格納します。
OutSystemsの標準Data Typeにはこれを実現するものがないため、Forgeコンポーネントを利用するか、自分でExtensionを書くことになります。
ここでは、Advanced HashtableというForgeのコンポーネントを利用します。
サンプル
Forgeコンポーネント:https://www.outsystems.com/forge/Component_Overview.aspx?ProjectId=7064
AdvancedHashtable Screenを参照してください。
環境
Personal Environment(Version 11.0.606.0)
Service Studio(Version 11.6.25)
Advanced Hashtable(Version 3.0.0)
基本的な使い方
- HT_Init
- ハッシュテーブルを用意します
- 後続のAdvanced HashtableのActionはこのActionのOutputをパラメータに渡します
- HT_Set
- ハッシュテーブルにデータを1つ設定します
- 同じキーが登録済みであれば、その値を上書き
- 未登録であれば、キーと値のセットを追加します
- パラメータ:ハッシュテーブル、キー(Text型)、値(Object型)
- Object型にキャストする際には、組み込みのFunction ToObject()を使用してください
- HT_GetText
- ハッシュテーブルからデータを1つ取得します
- Get〇〇というActionがいくつかあります
- 〇〇にはOutSystemsの基本型が入り、取り出される値は、その型にキャストされて出てきます
- データはキーで指定します
- キーが未登録だと、値は各方の初期値を返すようです(C#のソースを見る限り)
- 指定型にキャストできない場合、例外がスローされるようです
Object型について注意
ドキュメントに記述が見つけられないのですが、ScreenのObject型Variableには、Screen Actionからアクセスできないようです。よって、PreparationでInitして、Screen Actionでその変数を使いまわしていくということができません。
フォーラムでは、記述がありました:https://www.outsystems.com/forums/discussion/33090/not-possible-to-use-a-variable-of-type-object/
また、一度Object型にしてしまった変数は、再び元の型にキャストし直す方法が組み込みFunctionでは提供されていません。よってHT_GetObjectを使うときは注意が必要です。
キーや値を列挙する
- HT_Keys
- ハッシュテーブル内の全キーをListとして返します
- HT_Values
- ハッシュテーブル内の全値をListとして返します
- ただし、Text型にキャストできるもののみ
- HT_Entries
- ハッシュテーブル内の全データを、キーと値をAttributeに持つStructureのListとして返します
- これも、値をText型にキャストできるもののみ
例えば、HT_KeysでキーのListを取り、ListSortで並べ替え、その結果をループしてHT_GetTextなどにかければ、キーの昇順などでリストを取得できます。
その他の操作
- HT_Count
- ハッシュテーブル内のデータの個数(キーの個数)を返します
- HT_Clear
- ハッシュテーブルを空(データの個数0)にします
- HT_Exists
- ハッシュテーブル内に指定のキーがすでにあるかをBooleanで返します
例えば、1エントリ追加した状態で以下のようにActionを呼ぶと、最初のHT_Countは1、2回めのHT_Count2は0を返します。