連想配列

連想配列とは、自動的に割り当てられる数字をキーとして持つかわりに、自由に任意の文字列を割り振ることができる配列のことです。添え字に番号の変わりに名前をつけることでわかりやすく管理することができます。

構文
// 連想配列の宣言
HASHTBL 変数

// 大文字小文字を区別する(デフォルトは区別しない)
HASHTBL 変数 = HASH_CASECARE

// 順列で読出す時にキーはソートされている
HASHTBL 変数 = HASH_SORT

// キーにデータを代入
変数[キー] = データ

// キーが存在するか
変数[キー, HASH_EXISTS]

// キーを削除
変数[キー, HASH_REMOVE]

// 指定した順列番号のキーを取得
変数[順列番号, HASH_KEY]

// 指定した順列番号のデータを取得
変数[順列番号, HASH_VAL]

// 連想配列を削除
変数 = HASH_REMOVEALL
引数
戻り値

プログラム実行例

無線LANのインターフェイス情報を取得

HASHTBL LAN

str = SPLIT(DOSCMD("netsh wlan show interface"), "<#CR>")

FOR n = 0 TO UBound(str)
	IFB POS(":", str[n]) THEN
		arr = SPLIT(str[n], ":")
		LAN[TRIM(arr[0])] = TRIM(arr[1])
	ENDIF
NEXT

DIM items[] = "名前", "説明", "GUID", "物理アドレス", "状態", _
				"SSID", "BSSID", "ネットワークの種類", "無線の種類", "認証", _
				"暗号", "接続モード", "チャネル", "受信速度 (Mbps)", "送信速度 (Mbps)", _
				"シグナル", "プロファイル", "ホストされたネットワークの状態"

FOR item IN items
	PRINT item + ":" + LAN[item]
NEXT

//////////////////////////////////////////////////
// 【引数】
//   配列 : 上限値を求める配列 
// 【戻値】
//   配列の上限値 
//////////////////////////////////////////////////
FUNCTION UBound(array[])
	RESULT = RESIZE(array)
FEND
    (1) (3,7) (3) (5) (6) (8)
結果
名前:ワイヤレス ネットワーク接続
説明:Intel(R) WiFi Link 1000 BGN
GUID:***
物理アドレス:74
状態:接続されました
SSID:***
BSSID:18
ネットワークの種類:インフラストラクチャ
無線の種類:802.11n
認証:WPA2-パーソナル
暗号:CCMP
接続モード:自動接続
チャネル:10
受信速度 (Mbps):72
送信速度 (Mbps):72
シグナル:80%
プロファイル:***
ホストされたネットワークの状態:利用不可

HASHTBL fruits

fruits&#91;"apple"&#93; = "りんご"
fruits&#91;"grape"&#93; = "ぶどう"
fruits&#91;"cherry"&#93; = "さくらんぼ"
fruits&#91;"peach"&#93; = "もも"
fruits&#91;"banana"&#93; = "バナナ"

FOR item IN fruits
	PRINT item + ":" + fruits&#91;item&#93;
NEXT
    (1)
結果
apple:りんご
grape:ぶどう
cherry:さくらんぼ
peach:もも
banana:バナナ

連想配列をキーでソートする

キーをソートするには宣言時に「HASH_SORT」を指定します。

HASHTBL fruits = HASH_SORT

fruits["apple"] = "りんご"
fruits["grape"] = "ぶどう"
fruits["cherry"] = "さくらんぼ"
fruits["peach"] = "もも"
fruits["banana"] = "バナナ"

FOR item IN fruits
	PRINT item + ":" + fruits[item]
NEXT
    (1)
結果
apple:りんご
banana:バナナ
cherry:さくらんぼ
grape:ぶどう
peach:もも

連想配列のキーの大文字小文字の区別をする

キーの大文字と小文字を区別するには宣言時に「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"]
    (1)
結果

ぶどう

連想配列のキーでソートし、かつ、大文字小文字を区別する

キーの大文字と小文字を区別し、さらにソートするには宣言時に「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
    (1)
結果

ぶどう

apple:りんご
banana:バナナ
cherry:さくらんぼ
grape:ぶどう
peach:もも

連想配列のキーが存在するか調べる

HASH_EXISTSでキーが存在するかどうかを調べることができます。以下の例の場合apple(りんご)は宣言されているのでTrueを返しますが、pear(梨)は宣言されていないのでFalseが返ります。

HASHTBL fruits

fruits["apple"] = "りんご"
fruits["grape"] = "ぶどう"
fruits["cherry"] = "さくらんぼ"
fruits["peach"] = "もも"
fruits["banana"] = "バナナ"

PRINT "apple:" + fruits["apple", HASH_EXISTS]
PRINT "pear:" + fruits["pear", HASH_EXISTS]
    (1)
結果
apple:True
pear:False

連想配列のキーを削除する

キーを削除するにはHASH_REMOVEを使います。キーを削除できた場合Trueが返ります。

HASHTBL fruits

fruits["apple"] = "りんご"
fruits["grape"] = "ぶどう"
fruits["cherry"] = "さくらんぼ"
fruits["peach"] = "もも"
fruits["banana"] = "バナナ"

PRINT fruits["apple", HASH_REMOVE]
PRINT "apple:" + fruits["apple", HASH_EXISTS]
    (1)
結果
True
apple:False

順列番号でキーを取得するにはHASH_KEY、値を取得するにはHASH_VALを指定します。連想配列の最大要素数は「LENGTH(変数) - 1」で取得できます。

HASHTBL fruits

fruits["apple"] = "りんご"
fruits["grape"] = "ぶどう"
fruits["cherry"] = "さくらんぼ"
fruits["peach"] = "もも"
fruits["banana"] = "バナナ"

FOR n = 0 TO LENGTH(fruits) - 1
	PRINT fruits[n, HASH_KEY]  + ":" + fruits[n, HASH_VAL]
NEXT
    (1)
結果
apple:りんご
grape:ぶどう
cherry:さくらんぼ
peach:もも
banana:バナナ

連想配列を削除するには「HASH_REMOVEALL」を使います。

HASHTBL fruits

fruits["apple"] = "りんご"
fruits["grape"] = "ぶどう"
fruits["cherry"] = "さくらんぼ"
fruits["peach"] = "もも"
fruits["banana"] = "バナナ"

PRINT "HASH_REMOVEALL実行前"
PRINT fruits["apple"]
PRINT 

fruits = HASH_REMOVEALL

PRINT "HASH_REMOVEALL実行後"
PRINT fruits["apple"]
    (1)
結果
HASH_REMOVEALL実行前
りんご

HASH_REMOVEALL実行後

連想配列のキーと値を入れ替える

HASHTBL fruits

fruits["apple"] = "りんご"
fruits["grape"] = "ぶどう"
fruits["cherry"] = "さくらんぼ"
fruits["peach"] = "もも"
fruits["banana"] = "バナナ"

hashInvert(fruits)

FOR n = 0 TO LENGTH(fruits) - 1
	PRINT fruits[n, HASH_KEY] + ":" + fruits[n, HASH_VAL]
NEXT

//////////////////////////////////////////////////
// 【引数】
//   hash : キーと値を入れ替える連想配列(参照引数) 
// 【戻値】
//   
//////////////////////////////////////////////////
PROCEDURE hashInvert(Var hash[])
	HASHTBL tmp
	DIM cnt = LENGTH(hash)
	FOR n = 0 TO cnt - 1
		tmp[hash[n, HASH_VAL]] = hash[n, HASH_KEY]
	NEXT
	hash = HASH_REMOVEALL
	FOR n = 0 TO cnt - 1
		hash[tmp[n, HASH_KEY]] = tmp[n, HASH_VAL]
	NEXT
FEND
    (1) (9)
結果
りんご:apple
ぶどう:grape
さくらんぼ:cherry
もも:peach
バナナ:banana

関連記事

CALCARRAY (スクリプト関数)
配列データを計算します。
GETALLWIN (スクリプト関数)
全ウィンドウのIDを取得します。
JOIN (スクリプト関数)
配列の中身を区切り文字で結合し、文字列として返します。
POPUPMENU (スクリプト関数)
ポップアップメニューを表示します。
SLICE (スクリプト関数)
配列の中を指定範囲の配列で返します。
SPLIT (スクリプト関数)
文字列を区切り、配列を作成します。
UBound (自作関数)
配列の最大インデックスを返します。
FOR-IN-NEXT
配列の要素分だけ処理を繰り返します。FOR文でも書き換えられます。
inArray (自作関数)
divisors (自作関数)
引数に指定した数値の約数をリストを配列で返します。
gnomeSort (自作関数)
ノームソートはソートアルゴリズムの一つです。挿入ソートに似ているが、要素の移動は挿入ではなくバブルソートのような一連の交換で行います。
heapSort (自作関数)
引数に指定された配列をヒープソートで並び替えます。
QSORT (スクリプト関数)
配列の中身をソートします。
RESIZE (スクリプト関数)
配列のサイズを変更します。
SETCLEAR (スクリプト関数)
配列を指定された値で埋めます。
SHIFTARRAY (スクリプト関数)
配列データをシフトします。
bubbleSort (自作関数)
引数に指定した配列をバブルソートで並び替えます。
shakerSort (自作関数)
シェーカーソートは、ソートのアルゴリズムの一つです。バブルソートを改良したもの。双方向バブルソート、改良交換法とも言われます。バブルソートではスキャンを一方向にしか行わないのに対し、シェーカーソートでは交互に二方向に行います。
combSort (自作関数)
コムソートではソートの初期段階では離れた要素を比較交換します。そして徐々に2つの要素間の距離を縮めて、最後に直接隣接している要素どうしの比較交換を行います。
selectionSort (自作関数)
選択ソートは、ソートのアルゴリズムの一つ。配列された要素から、最大値やまたは最小値を探索し配列最後の要素と入れ替えを行うことでソートします。
oddEvenSort (自作関数)
奇偶転置ソートは、ソートのアルゴリズムの一つで、バブルソートを改良したもの。バブルソートではスキャンを一方向に順次行うのに対し、奇偶転置ソートでは組ごとに行います。
shearSort (自作関数)
シェアソートはソートアルゴリズムの一つで、データを長方形に並べた上で各行・各列ごとにソートを行ないます。
arraySearch (自作関数)
配列の中から指定した要素が見つかった場合、その要素がある最初のインデックスを返します。
arrayReverse (自作関数)
引数に指定した配列を逆順にして返します。
insertionSort (自作関数)
挿入ソートは、ソートのアルゴリズムの一つ。整列してある配列に追加要素を適切な場所に挿入します。
shellSort (自作関数)
シェルソートは挿入ソートが改良された整列アルゴリズムです。リストにおいてあらかじめ離れている要素を交換しておき、最終的に挿入ソートを実行します。
mergeSort (自作関数)
マージソートは整列されていないリストを2つのリストに分割して、それぞれを整列させた後、それらをマージして整列済みのひとつのリストを作ります。
quickSort (自作関数)
問題を小さな部分問題に分割していく分割統治法を利用した手法で、データから適当に基準値を決めこれより大きいグループと小さいグループに分けるという手順を、分けた小さなグループに対しても再帰的に繰り返していきます。
bogoSort (自作関数)
要素をランダムに並べ替えることで偶発的な一致を試みる整列アルゴリズムです。