Dictionary オブジェクトの並び順
仕事でVBAやVBScriptを書くことが多いが、良く使っているオブジェクトの一つがScripting.Dictionary。
気になったのが、Dictionaryオブジェクトから値を取り出す順番。
Dictionaryオブジェクト自身は、この(http://www.atmarkit.co.jp/ait/articles/0907/29/news113_2.html)ページによると、
キーの格納順序については保証されない。例えば要素を列挙した際、最後に追加した要素が最後に現れるかどうかは分からない
とのこと。しかし、実際に下記のようなソースを実行すると、1~100まで格納した順に値が取り出される。
Option Explicit Dim objDic Set objDic = WScript.CreateObject("Scripting.Dictionary") Dim i For i = 1 to 100 objDic.Add i, "値:" & i Next Dim key For each key In objDic.Keys WScript.echo objDic(key) Next
実はMicrosoftのサイトでこんな記述を発見した。
Sorting a Scripting Dictionary Populated with String Data
DictionaryオブジェクトがSortメソッドを実装していないので、ソート方法を紹介しているページなのだが、そこには、
Because this information is stored unsorted, enumerating through the array returns information in the order it was stored.
と書かれている。要は
Dictionaryオブジェクトは値をソートしないで格納し、取り出す時は"値を追加した順番で取り出される" (ので、ソートする方法を紹介しようとおもったよー)
という事らしい。なんだって?値を追加した順番?
つまり、追加するだけで、Remove等を行わなければ、キュー(先入れ先出し)みたいな使い方もできるというわけか。