Contents
連想配列とは、自動的に割り当てられる数字をキーとして持つかわりに、自由に任意の文字列を割り振ることができる配列のことです。添え字に番号の代わりに名前をつけることでわかりやすく管理することができます。
- 構文
- // 連想配列の宣言
HASHTBL 変数
// 大文字小文字を区別する(デフォルトは区別しない)
HASHTBL 変数 = HASH_CASECARE
// 順列で読出す時にキーはソートされている
HASHTBL 変数 = HASH_SORT
// キーにデータを代入
変数[キー] = データ
// キーが存在するか
変数[キー, HASH_EXISTS]
// キーを削除
変数[キー, HASH_REMOVE]
// 指定した順列番号のキーを取得
変数[順列番号, HASH_KEY]
// 指定した順列番号のデータを取得
変数[順列番号, HASH_VAL]
// 連想配列を削除
変数 = HASH_REMOVEALL
削除 HASH_REMOVE は必要無くとも変数で受ける必要あり
- 引数
- 戻り値
連想配列とは
配列の添え字に好きな名前をつけられる配列のことです。
配列との違い
配列は添え字(インデックス)が0から始まる連番になります。一方、連想配列は添え字に数字だけではなく文字列(キー)を付けることもできます。
シンプルなデータの場合は配列でも特に問題はないですが、配列の中にいろいろなデータを格納するとき、添え字が連番だとどこになんのデータが入っているのかがわかりづらくなってしまいます。
そこで配列のキーを番号で管理するのではなく名前を付けることによって、どこに何のデータが格納されているのかわかりやすくなります。
以下のように配列で書いた場合、配列名がuserだから個人に関することが格納されてるんだろうとか、「田中」が名前っていうのはわかるけど、「21」って何の値だっけ?とか「0105」って何の番号だ?とかなってくると思います。
DIM user[] = "田中", 21, "0105"
そこで連想配列でインデックスに名前をつけておくと、「21」はageだから年齢で、「0105」がbirthdayだから誕生日かっていうのがひと目でわかるようになります。
HASHTBL user
user["name"] = "田中"
user["age"] = 21
user["birthday"] = "0105"
要素の追加
要素を追加するには以下のように記述します。要素を追加すると順列番号は0から順に1ずつ加算されていきます。
連想配列名[キー名]
以下は要素を追加するプログラムです。
HASHTBL user
user["name"] = "田中"
PRINT user["name"]
- 結果
田中
すでに存在する要素に値を追加した場合、データが上書きされます。
HASHTBL user
user["name"] = "田中"
user["name"] = "大西"
PRINT user["name"]
- 結果
大西
要素の存在有無の確認
要素が存在するか確認するには以下のように記述します。存在する場合はTrue、存在しない場合にはFalseが返ります。
連想配列名[キー名, HASH_EXISTS]
以下は要素が存在するか確認するプログラムです。user[age]は存在するのでTrue、user[id]は存在しないのでFalseが返ります。
HASHTBL user
user["name"] = "田中"
user["age"] = 21
user["birthday"] = "0105"
PRINT user["age", HASH_EXISTS]
PRINT user["id", HASH_EXISTS]
- 結果
True False
キーを削除
連想配列のキーを削除するには以下のように記述します。キーを削除できた場合True、削除できなかった(存在しなかったなどの)場合はFalseが返ります。キーを削除すると削除したキー以降の順列番号が詰められ連番は維持されます。
連想配列名[キー, HASH_REMOVE]
以下はキーを削除するプログラムです。1回目の削除はnameキーが存在するのでTrueが返りますが、2回目はすでに削除されていてnameキーが存在しないのでFalseが返ります。
HASHTBL user
user["name"] = "田中"
PRINT user["name", HASH_REMOVE]
PRINT user["name", HASH_REMOVE]
- 結果
True False
HASH_REMOVEは必要無くとも変数で受ける必要があるので、以下のように記述するとエラーが発生します。
HASHTBL user
user["name"] = "田中"
user["name", HASH_REMOVE]
そのため結果を変数に代入するか画面やログに出力する必要があります。
HASHTBL user
user["name"] = "田中"
DIM tmp = user["name", HASH_REMOVE]
わざわざ変数を使いたくないというときはFUKIDASI関数 (スクリプト関数)で画面に出力してください。
HASHTBL user
user["name"] = "田中"
FUKIDASI(user["name", HASH_REMOVE])
順列番号からキー名を取得
順列番号からキー名を取得するには以下のように記述します。
連想配列名[順列番号, HASH_KEY]
HASHTBL user
user["name"] = "田中"
user["age"] = 21
user["birthday"] = "0105"
PRINT user[2, HASH_KEY]
- 結果
birthday
順列番号は 0 以上 要素数-1 以下の範囲を取ります。そのためFOR文でループすることも可能です。ループする際、順列番号に変数を指定します。
HASHTBL user
user["name"] = "田中"
user["age"] = 21
user["birthday"] = "0105"
FOR i = 0 TO LENGTH(user)-1
PRINT user[i, HASH_KEY]
NEXT
- 結果
name age birthday
順列番号からデータを取得
順列番号からデータを取得するには以下のように記述します。
連想配列名[順列番号, HASH_VAL]
HASHTBL user
user["name"] = "田中"
user["age"] = 21
user["birthday"] = "0105"
PRINT user[2, HASH_VAL]
- 結果
0105
連想配列をキー名でソートする
連想配列をキー名で昇順ソートするには連想配列宣言時に「HASH_SORT」を指定します。
HASHTBL fruits = HASH_SORT OR HASH_CASECARE
fruits["apple"] = "りんご"
fruits["grape"] = "ぶどう"
fruits["cherry"] = "さくらんぼ"
fruits["peach"] = "もも"
fruits["banana"] = "バナナ"
PRINT fruits["Apple"]
PRINT fruits["grape"]
PRINT "----------"
FOR i=0 TO LENGTH(fruits)-1
PRINT fruits[i, HASH_KEY] + ":" + fruits[i, HASH_VAL]
NEXT
- 結果
apple: りんご banana: バナナ cherry: さくらんぼ grape: ぶどう peach: もも
以下はFOR-IN-NEXTで書いた場合。
HASHTBL fruits = HASH_SORT
fruits["apple"] = "りんご"
fruits["grape"] = "ぶどう"
fruits["cherry"] = "さくらんぼ"
fruits["peach"] = "もも"
fruits["banana"] = "バナナ"
FOR item IN fruits
PRINT item + ":" + fruits[item]
NEXT
- 結果
apple: りんご banana: バナナ cherry: さくらんぼ grape: ぶどう peach: もも
降順ソートは指定できないので、昇順ソートした配列をFOR文で後ろから要素を取得していきます。
HASHTBL fruits = HASH_SORT OR HASH_CASECARE
fruits["apple"] = "りんご"
fruits["grape"] = "ぶどう"
fruits["cherry"] = "さくらんぼ"
fruits["peach"] = "もも"
fruits["banana"] = "バナナ"
FOR i=LENGTH(fruits)-1 TO 0 STEP -1
PRINT fruits[i, HASH_KEY] + ":" + fruits[i, HASH_VAL]
NEXT
- 結果
peach: もも grape: ぶどう cherry: さくらんぼ banana: バナナ apple: りんご
連想配列のキーの大文字小文字の区別をする
キーの大文字と小文字を区別するには宣言時に「HASH_CASECARE」を指定します。指定したキーの大文字と小文字を区別するので、「PRINT fruits["Apple"]」ではりんごは出力されません。
HASHTBL fruits = HASH_CASECARE
fruits["apple"] = "りんご"
fruits["grape"] = "ぶどう"
fruits["cherry"] = "さくらんぼ"
fruits["peach"] = "もも"
fruits["banana"] = "バナナ"
PRINT fruits["Apple"]
PRINT fruits["grape"]
- 結果
ぶどう
連想配列のキーでソートし、かつ、大文字小文字を区別する
キーの大文字と小文字を区別し、さらにソートするには宣言時に「HASH_SORT OR HASH_CASECARE」を指定します。
HASHTBL fruits = HASH_SORT OR HASH_CASECARE
fruits["apple"] = "りんご"
fruits["grape"] = "ぶどう"
fruits["cherry"] = "さくらんぼ"
fruits["peach"] = "もも"
fruits["banana"] = "バナナ"
PRINT fruits["Apple"]
PRINT fruits["grape"]
PRINT "----------"
FOR item IN fruits
PRINT item + ":" + fruits[item]
NEXT
- 結果
ぶどう ---------- apple: りんご banana: バナナ cherry: さくらんぼ grape: ぶどう peach: もも
連想配列のキー名と値を入れ替える
連想配列 (自作関数)を使い連想配列のキー名と値を入れ替えます。
HASHTBL fruits
fruits["apple"] = "りんご"
fruits["grape"] = "ぶどう"
fruits["cherry"] = "さくらんぼ"
fruits["peach"] = "もも"
fruits["banana"] = "バナナ"
arrayFlip(fruits)
FOR n = 0 TO LENGTH(fruits) - 1
PRINT fruits[n, HASH_KEY] + ":" + fruits[n, HASH_VAL]
NEXT
//////////////////////////////////////////////////
// 【引数】
// associative : キーと値を入れ替える連想配列。参照引数。
// 【戻り値】
//
//////////////////////////////////////////////////
PROCEDURE arrayFlip(Var associative[])
HASHTBL tmp
FOR i = 0 TO LENGTH(associative)-1
tmp[associative[i, HASH_VAL]] = associative[i, HASH_KEY]
NEXT
associative = HASH_REMOVEALL
FOR i = 0 TO LENGTH(tmp)-1
associative[tmp[i, HASH_KEY]] = tmp[i, HASH_VAL]
NEXT
FEND
- 結果
りんご: apple ぶどう: grape さくらんぼ: cherry もも: peach バナナ: banana
この記事は役に立ちましたか?
関連記事
- CALCARRAY関数 (スクリプト関数)
- 配列データを計算します。
- GETALLWIN関数 (スクリプト関数)
- 全ウィンドウのIDを取得します。
- GETOLEITEM関数 (スクリプト関数)
- コレクションを取得します。
- JOIN関数 (スクリプト関数)
- 配列の中身を区切り文字で結合し、文字列として返します。
- LENGTH関数 (スクリプト関数)
- 文字数もしくは配列サイズを返します。
- SETCLEAR関数 (スクリプト関数)
- 配列を指定された値で埋めます。
- SHIFTARRAY関数 (スクリプト関数)
- 配列データをシフトします。
- divisors (自作関数)
- 引数に指定した数値の約数のリストを返します。
- Collatz (自作関数)
- コラッツ数列 を求め結果を配列で返します。
- arraySearch (自作関数)
- 配列の中から指定した要素が見つかった場合、その要素がある最初のインデックスを返します。