ハッシュテーブル

PowerShell Coreには「ハッシュテーブル」と呼ばれるデータ格納方法が用意されている。PowerShell Coreのハッシュテーブルは連想配列や辞書(ディクショナリ)と呼ばれることもある。

前回取り上げた配列はデータを格納する方法のひとつで、格納したデータにアクセスするには0からはじまるインデックスを使用した。ハッシュテーブルにはインデックスがなく、その替わりに鍵を指定する。つまりハッシュテーブルにデータを格納するときにはかならず鍵と値のペアを指定する必要がある。

ハッシュテーブルには格納されるデータの順序に関しては保存しないものが多いが、PowerShell Coreのハッシュテーブルには格納順序を保存するものもある。配列と同様に同一のデータ型である必要はなく、数値や文字列、オブジェクトなど、好きなデータを値として格納することができる。

ハッシュテーブルの作成方法 @{}

ハッシュテーブルの作成には@{}という表記を利用する。配列は@()で作成したわけだが、ハッシュテーブルは@{}で作成する。中身を指定せずに利用すると、中身が空のハッシュテーブルを作成することができる。

@{}でハッシュテーブルを作成

PS /Users/daichi> $h = @{}
PS /Users/daichi> $h.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Hashtable                                System.Object


PS /Users/daichi>

ハッシュテーブルに含める鍵と値のペアは「鍵=値;」という形で記述していく。鍵に空白を含める場合にはダブルクォーテーションで囲む必要がある。値が文字列の場合には空白の有無に関係なく値をダブルクォーテーションで括る必要がある。

たとえば次のように記述することでハッシュテーブルデータを作成する。

ハッシュテーブルを作成

PS /Users/daichi> $h = @{class="bear"; name="ichiban shibori"; price=198}
PS /Users/daichi> $h.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Hashtable                                System.Object


PS /Users/daichi>

 

ハッシュテーブルは実際にはSystem.Object.Hashtableというクラスのオブジェクトになっている。データを表示させると、次のように鍵と値がペアになって出力されることを確認できる。

ハッシュテーブルの中身を表示

PS /Users/daichi> $h

Name                           Value
----                           -----
price                          198
class                          bear
name                           ichiban shibori


PS /Users/daichi>

ここで確認しておきたいのは、表示される順序が値を定義した順序になっていないという点だ。ハッシュテーブルでは順序は保存されないので、このような出力が行われている。

 

ハッシュテーブルのデータにアクセスする方法

ハッシュテーブルの値にアクセスするには、次のように変数名のあとに「.鍵」を指定すればよい。

ハッシュテーブルの値にアクセスする方法

PS /Users/daichi> $h.class
bear
PS /Users/daichi> $h.name
ichiban shibori
PS /Users/daichi> $h.price
198
PS /Users/daichi>

 

または、配列のときのように[]を使ってアクセスすることもできる。ただし、インデックスは指定できないので、替わりに次のように鍵を指定してアクセスを行う。

ハッシュテーブルの値にアクセスする方法 配列風

PS /Users/daichi> $h["class"]
bear
PS /Users/daichi> $h["name"]
ichiban shibori
PS /Users/daichi> $h["price"]
198
PS /Users/daichi>

   

ハッシュテーブルの値を上書きする方法

この記述はアクセスのみならず、値の上書きにも利用できる。書き方は.でも[]でもどちらでも構わない。次のように記述することで値を上書きすることができる。

ハッシュテーブルの値を上書きする方法 その1

PS /Users/daichi> $h.class = "bear"
PS /Users/daichi> $h.name = "malts"
PS /Users/daichi> $h.price = 208
PS /Users/daichi> $h

Name                           Value
----                           -----
price                          208
class                          bear
name                           malts


PS /Users/daichi>

ハッシュテーブルの値を上書きする方法 その2

PS /Users/daichi> $h["class"] = "bear"
PS /Users/daichi> $h["name"] = "malts"
PS /Users/daichi> $h["price"] = 208
PS /Users/daichi> $h

Name                           Value
----                           -----
price                          208
class                          bear
name                           malts


PS /Users/daichi>

 

ハッシュテーブルに鍵と値を追加する方法

すでに作成したハッシュテーブルにデータを追加する場合には、.Add()を使うか、または+演算子を使って次のように記述する。

ハッシュテーブルに鍵と値を追加する方法

PS /Users/daichi> $h.Add("date", (Get-Date))
PS /Users/daichi> $h = $h + @{"tax rate"=0.08}
PS /Users/daichi> $h

Name                           Value
----                           -----
price                          208
tax rate                       0.08
class                          bear
date                           2018/08/22 16:58:35
name                           malts


PS /Users/daichi>

 

ハッシュテーブルから鍵と値を削除する方法

逆に、ハッシュテーブルから鍵と値のペアを削除するには、次のように.Remove()を使用する。

ハッシュテーブルから鍵と値を削除する方法

PS /Users/daichi> $h.Remove("date")
PS /Users/daichi> $h.Remove("tax rate")
PS /Users/daichi> $h

Name                           Value
----                           -----
price                          208
class                          bear
name                           malts


PS /Users/daichi>

 

順序付きハッシュテーブル

ハッシュテーブルは順序を保存しないが、PowerShell Coreのハッシュテーブルは次のようにハッシュテーブルを作成する段階で[ordered]を指定すると、値を追加した順序を覚えるようになる。

[ordered]を指定してハッシュテーブルを作成

PS /Users/daichi> $h = [ordered]@{class="bear"; name="ichiban shibori"; price=198}
PS /Users/daichi> $h.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     OrderedDictionary                        System.Object


PS /Users/daichi> $h

Name                           Value
----                           -----
class                          bear
name                           ichiban shibori
price                          198


PS /Users/daichi>

[ordered]を指定した場合、作成されるオブジェクトがSystem.Object.OrderedDictionaryになっていることがわかる。[ordered]を指定しなかった場合にはSystem.Object.Hashtableが作成されていたわけで、指定を行うことで生成されるオブジェクトが変わったことを確認できる。

また出力が、データを追加した順序で行われている点に注目したい。追加した順序を保存しておく必要があるのであれば、この指定を使えばよいことになる。[ordered]を指定すたケースでは、後から鍵と値のペアを追加した場合にも追加順序を記憶した状態でデータが保持されていることを確認できる。

PS /Users/daichi> $h.Add("date", (Get-Date))
PS /Users/daichi> $h = $h + @{"tax rate"=0.08}
PS /Users/daichi> $h

Name                           Value
----                           -----
class                          bear
name                           ichiban shibori
price                          198
date                           2018/08/22 17:33:54
tax rate                       0.08


PS /Users/daichi>

 

ハッシュテーブルの操作の基本はこんなところだ。ハッシュテーブルにはオブジェクトを値として含めることができるので、さまざまなデータを入れておくことができる。当然、ハッシュテーブルをハッシュテーブルに含めることもできる。配列とともに操作方法を覚えておこう。

参考資料