ハッシュテーブルとは、キー(key)と値(value)のペアを保持しているコレクションである。通常の配列がインデックス番号により各値(各要素)にアクセスできるのに比べて、ハッシュテーブルでは、インデックス番号の代わりにキーを用いて、その各値にアクセスすることができる。キーと、そのキーから連想される(対応付けられている)値のペアを保持しているため、ハッシュテーブルは「連想配列」とも呼ばれる。ハッシュテーブルの特長は、指定したキーから、それに対応した値を高速に得られることである。
.NET Frameworkのクラス・ライブラリでは、ハッシュテーブルがHashtableクラス(System.Collections名前空間)で実装されている。本稿では、このHashtableクラスの基本的な利用方法についてまとめる。
ハッシュテーブルへの項目の追加
ハッシュテーブルへの項目(キーと値のペア)の追加は、インデクサ(VB.NETの場合は既定のプロパティとなっているItemプロパティ)か、Addメソッドにより行う。
[C#の場合] Hashtable ht = new Hashtable(); ht["japan"] = "日本"; ht.Add("china", "中国");
[VB.NETの場合] Dim ht As Hashtable = New Hashtable ht("japan") = "日本" ht.Add("china", "中国")
指定したキーがハッシュテーブル(この例ではht)に存在しない場合には、新しい要素として登録される。キーがすでに存在する場合には、インデクサではそのキーに対応する値が置き換えられるが、Addメソッドでは例外が発生する。
なお、この例ではキーと値の両方に文字列を用いているが、実際にはObject型のキーと値が指定可能であるため、どのようなオブジェクトでもHashtableオブジェクトに格納できる。
ハッシュテーブル内の値の取得
ハッシュテーブル内の値の取得は、上記と同様にインデクサ(VB.NETではItemプロパティ)によりキーを指定して行う(逆に、値からキーを直接取得することはできない)。いま述べたように、ハッシュテーブルは要素をObject型のオブジェクトとして保持しているため、必要なら元の型に変換しなければならない。
C#の場合] string val = (string)ht["japan"];
[VB.NETの場合] Dim str As String = CType(ht("japan"), String)
指定したキーがハッシュテーブルに存在しない場合には、null(VB.NETではNothing)が返される。
すべてのキーや値の列挙
ハッシュテーブルに格納されているすべてのキーあるいは値は、コレクションとしてKeysプロパティあるいはValuesプロパティからアクセスできる。このため、foreachステートメント(VB.NETではFor Each...Next)などを使って、すべてのキーや値を列挙することができる(記述例は下のサンプル・プログラムを参照)。
キーや値の存在チェック
特定のキーや値がハッシュテーブルに格納されているかどうかは、ContainsKeyメソッドあるいはContainsValueメソッドを使用する。この2つのメソッドはbool型(VB.NETではBoolean型)の値(TrueかFalse)を返す(記述例は下のサンプル・プログラムを参照)。
ハッシュテーブルを使ったサンプル・プログラム
ここまでの解説をまとめたサンプル・プログラム(C#版およびVB.NET版)を以下に示す。
// hashtable.cs using System; using System.Collections; public class test { static void Main() { Hashtable ht = new Hashtable(); // データの追加その1 ht["japan"] = "日本"; ht["america"] = "アメリカ"; // データの追加その2 ht.Add("china", "中国"); ht.Add("india", "インド"); // データの取得 string val = (string)ht["japan"]; Console.WriteLine(val); // 出力:日本 // キー項目の列挙 foreach (string key in ht.Keys) { Console.WriteLine("{0} : {1}", key, ht[key]); } // 出力例: // india : インド // japan : 日本 // america : アメリカ // china : 中国 // 値項目の列挙 foreach (string value in ht.Values) { Console.WriteLine(value); } // 出力例: // インド // 日本 // アメリカ // 中国 // キーの存在チェック if (!ht.ContainsKey("france")) { ht["france"] = "フランス"; } // 値の存在チェック Console.WriteLine(ht.ContainsValue("日本")); // 出力例:True // エントリ(キーと値)の列挙 foreach (DictionaryEntry de in ht) { Console.WriteLine("{0} : {1}", de.Key, de.Value); } // 出力例: // india : インド // japan : 日本 // france : フランス // america : アメリカ // china : 中国 } }// コンパイル方法:csc hashtable.cs
ハッシュテーブルを使ったC#のサンプル・プログラム(hashtable.cs)
' hashtable.vb Imports System Imports System.Collections Class HashTableSample Shared Sub Main() Dim ht As Hashtable = New Hashtable ' データの追加その1 ht("japan") = "日本" ht("america") = "アメリカ" ' データの追加その2 ht.Add("china", "中国") ht.Add("india", "インド") ' データの取得 Dim str As String = CType(ht("japan"), String) Console.WriteLine(str) ' 出力:日本 ' キー項目の列挙 For Each key As String In ht.Keys Console.WriteLine("{0} : {1}", key, ht(key)) Next ' 出力例: ' india : インド ' japan : 日本 ' america : アメリカ ' china : 中国 ' 値項目の列挙 For Each val As String In ht.Values Console.WriteLine(val) Next ' 出力例: ' インド ' 日本 ' アメリカ ' 中国 ' キーの存在チェック If Not ht.ContainsKey("france") Then ht("france") = "フランス" End If ' 値の存在チェック Console.WriteLine(ht.ContainsValue("アメリカ")) ' 出力:True ' エントリ(キーと値)の列挙 For Each de As DictionaryEntry In ht Console.WriteLine("{0} : {1}", de.Key, de.Value) Next ' 出力例: ' india : インド ' japan : 日本 ' france : フランス ' america : アメリカ ' china : 中国 End Sub End Class' コンパイル方法:vbc hashtable.vb
ハッシュテーブルを使ったVB.NETのサンプル・プログラム(hashtable.vb)