【VB.NET】Hashtable(連想配列) の使い方【VB.NET】Hashtable(連想配列) の使い方をわかりやすく説明します。
ハッシュテーブルとは、キー(key)と値(value)のペアを保持しているコレクション(System.Collections 名前空間)で、通常の配列がインデックス番号により各値(各要素)にアクセスできるのに対して、ハッシュテーブルでは、インデックス番号の代わりにキーを用いて、その各値にアクセスします。
イメージとしは、「キー:山」、「値:川」というハッシュテーブルを用意して置けば、合言葉の「山」→「川」のように値が取り出せます。
ちなみにハッシュテーブルの「ハッシュ」は、ハッシュドビーフのハッシュと同じ意味で、細切れという意味です。
テーブルが細切れになっているとかそういうわけではなくただ単にハッシュ値という細切れにしたコンピューターに管理しやすい値で管理されている為ハッシュテーブルと言います。
※ハッシュドビーフは細切れにされた牛肉という意味の料理です。
内容
ハッシュテーブルには以下のような特徴があります。
- 収める『キー』と『値』はObject型で格納される。
- ハッシュは仕様上、絶対に一意となるわけではないのでごくまれに衝突(collision)しますが、内部的に上手いこと回避する仕組みになっているので気にしなくていい。
- ハッシュテーブルの最大の特長は、指定したキーから、それに対応した値を高速に得られること。
- 別名「連想配列」ともいう。
紹介して置いてなんですが、2と4は別に覚える必要はないです。
宣言方法
宣言の仕方は2通りあります。どちらでも同じなので好きな方でOKです。
宣言の後に項目設定する方法
' 宣言 Dim 変数名 As Hashtable = New Hashtable ' 項目設定 変数名.Add(キー1, 値1)
宣言と同時に項目設定する方法
' 宣言 + 項目設定
Dim 変数名 As Hashtable = New Hashtable From {
{キー1, 値1},
{キー2, 値2},
{キー3, 値3}
}
配列が値を1つずつ持つのに対して、キーと値で二人一組としてそれを配列として持っているイメージです。
項目の追加
項目の追加は2通りです。これも好きな方でOKですが、個人的なことを言えばやり方1を推奨します。
なぜならやり方2は値変更の時にも使えるやり方なので、一目で追加ということが直ぐにわかるやり方1の方が後からコードが読みやすいからです。
' 項目設定やり方1 変数名.Add(キー, 値)
' 項目設定やり方2 変数名(キー) = 値
値の変更
値を変更する場合は、下記の通りです。
変数名(キー) = 値
値を変更するつもりでAddするとエラーが発生します。
変数名.Add(既存のキー, 値)
System.ArgumentException: 項目は既に追加されています。
項目の削除
項目の削除する場合は、項目を削除したいときは、Removeメソッドを使います。
変数名.Remove(キー)
項目の全件削除
項目の全件削除する場合は、Clearメソッドを使います。
変数名.Clear()
キー、値が設定済みか確認する
既に『キー』が設定済みかチェックする
変数名.ContainsKey(キー)
既に『値』が設定済みかチェックする
変数名.ContainsValue(値)
Boolean型で「True」or「False」が返ってきます。
キー、値の一覧を列挙する
For Each 文で簡単に取得できます。
' キー項目の列挙
For Each key As Object In 変数名.Keys
Console.WriteLine(key)
Next
' 値項目の列挙
For Each val As Object In 変数名.Values
Console.WriteLine(val)
Next
' エントリ(キーと値)の列挙
For Each de As DictionaryEntry In 変数名
Console.WriteLine("{0} : {1}", de.Key, de.Value)
Next
サンプルコード
全体のサンプルコード
Module Module1
Class A
End Class
Sub Main()
' 宣言 + 項目設定
Dim ht As Hashtable = New Hashtable From {
{"名前1", "みかん"},
{"名前2", "りんご"}
}
' 項目追加
ht.Add("名前3", "ばなな")
' 項目追加 キーと値はオブジェクト型で受け取る事が出来る
Dim obj1 = New A()
Dim obj2 = New A()
ht.Add(obj1, obj2)
' 値を変更
ht("名前2") = "いちご"
' ハッシュテーブルの件数を取得
Console.WriteLine(ht.Count)
' キー と 値の列挙
For Each de As DictionaryEntry In ht
Console.WriteLine("キー:{0} =値: {1}", de.Key, de.Value)
Next
' キーで値にアクセス出来る
Console.WriteLine(ht("名前3")) 'ばなな
' 存在しないキーを指定すると Nothing を戻す
Console.WriteLine(ht("名前4") Is Nothing) 'True
' キーが存在するか確認
Console.WriteLine(ht.ContainsKey("名前1")) 'True
' 値が存在するか確認
Console.WriteLine(ht.ContainsValue("みかん")) 'True
' 別のインスタンス
Console.WriteLine(ht.ContainsKey(New A())) 'False
Console.WriteLine(ht.ContainsValue(New A())) 'False
' 同じインスタンス
Console.WriteLine(ht.ContainsKey(obj1)) 'True
Console.WriteLine(ht.ContainsValue(obj2)) 'True
End Sub
End Module

コメント