blechmusikの日記

キー・カスタマイズ・ソフトウェア "DvorakJ" の覚え書きをはじめとして様々なことを書いています。

データの追加順序が保持されている連想配列を利用する

以下のページで公開されているOrderedArray関数のライブラリを使うと、データの追加順序が保持されている連想配列を利用できる。


例を示しながら具体的に説明したい。三つのキーと値からなる連想配列をこのようにつくるとする。

Object("a", 30, "c", 20, "b", 10)

これらのキーと値を順番に表示してみよう。

For Key, Value in Object("a", 30, "c", 20, "b", 10)
    MsgBox,% Key . ", " . Value

結果は次のようなものだ。Forの処理がa,b,cのキーの順番で行われていることがわかる。

a, 30
b, 10
c, 20

このように、 AutoHotkey_L で連想配列を用いると意図しないキーの並び替えが生じてしまう。
そこで OrderdArray()を使ってみよう。

For Key, Value in OrderdArray("a", 30, "c", 20, "b", 10)
    MsgBox,% Key . ", " . Value
a, 30
c, 20
b, 10

キーを並び替えずに、データを追加した順序で値を取り出すことができた。
Object(...)とOrderdArray(...)のそれぞれの結果を比較してみよう。

MsgBox,% "arguments: (""a"", 30, ""c"", 20, ""b"", 10)`n`n"
       . "Object(...):`n" . getKeyAndValue(Object("a", 30, "c", 20, "b", 10)) . "`n"
       . "OrderedArray(...):`n" . getKeyAndValue(OrderedArray("a", 30, "c", 20, "b", 10))
return

getKeyAndValue(arr){
    tmp := ""
    For Key, Value in arr
        tmp .= "`t" . Key . ", " . Value . "`n"
    return tmp
}

f:id:blechmusik2:20130606020159p:plain


データを追加した順序に従いキーの値に応じた処理をするときには、このOrderdArray()を活用することになるだろう。


ただし、重複するキーが存在する場面において、OrderdArray()を使ってもデータの追加順序が維持されないことに注意しなければならない。次の例では "c" にまず 10 を、それから 0 を紐付けているが、 Object(...) と OrderdArray(...) のどちらを用いても、メッセージボックスに表示されるのは c, 0 というテキストだ。

For Key, Value in Object("c", 10, "c", 0)
    MsgBox,% Key . ", " . Value
For Key, Value in OrderedArray("c", 10, "c", 0)
    MsgBox,% Key . ", " . Value


これらをまとめてみよう。OrderdArray関数を利用すれば、データの追加順序が保持されている連想配列を利用できる。ただし、キーが重複している場合にはデータの追加順序が保持されなくなる。