|
.NET TIPS ハッシュテーブル(連想配列)を使うには?デジタルアドバンテージ2004/02/20 |
![]() |
|
|
|
| 本稿の内容に加筆・修正を行い.NET Framework 2.0に対応させた「TIPS:ハッシュテーブル(連想配列)を使うには?(Dictionaryクラス編)」もご覧ください。 |
ハッシュテーブルとは、キー(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版)を以下に示す。
|
|
| ハッシュテーブルを使ったC#のサンプル・プログラム(hashtable.cs) | |
|
|
| ハッシュテーブルを使ったVB.NETのサンプル・プログラム(hashtable.vb) | |
サンプル・プログラムの最後では、ハッシュテーブル内の要素(エントリ)を列挙する方法も示している。この場合には、ハッシュテーブル内の各要素はDictionaryEntry構造体(System.Collections名前空間)のオブジェクトとして取り扱われる。なお通常の配列などと異なり、ハッシュテーブルでは格納した要素の順序は保持されない。このためキーや値や要素を列挙した場合に、どのような順で要素が取り出されるかは不定である。
もしキーも値も文字列に限定できる場合には、StringDictionaryクラス(System.Collections.Specialized名前空間)も便利に使える。このクラスはHashtableクラスをラップし、メソッドやプロパティで扱う型をString型に限定したものだ。![]()
| カテゴリ:クラス・ライブラリ 処理対象:コレクション 使用ライブラリ:Hashtableクラス(System.Collections名前空間) 使用ライブラリ:DictionaryEntry構造体(System.Collections名前空間) 使用ライブラリ:StringDictionaryクラス(System.Collections.Specialized名前空間) |
|
||||||||||||||||||||||||||||
| 「.NET TIPS」 |
| 更新履歴 | |||||
|
TechTargetジャパン
- Kinectが切り開く“夢の近未来” (2012/2/2)
日本を含めた世界中でKinect for Windowsセンサー商用版とSDK正式版がリリース。未来のコンピューティングはどう変化するのか? - 3つの視点でネイティブと.NETの適材適所を考察 (2012/1/31)
アプリ開発は「ネイティブ」と「.NET」、どちらが最良? その問いには「適材適所」と答えるしかない。では、“適所”は一体どこかを考察する - SQL Azure Data Sync入門 (2012/1/30)
SQL Azure/SQL Serverデータベース間のデータ同期を簡単に実現するサービスとは? その仕組みや使用手順を解説 - Windows Phoneアプリ市場の現状を分析する (2012/1/27)
Windows Phone のアプリ・ストアに日々登録されている多種多様なアプリ。カテゴリ別のアプリ数は? 市場の現状を明らかにする
|
|
キャリアアップ
スポンサーからのお知らせ
- - PR -
イベントカレンダー
- - PR -


