.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版)を以下に示す。

// 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)

 サンプル・プログラムの最後では、ハッシュテーブル内の要素(エントリ)を列挙する方法も示している。この場合には、ハッシュテーブル内の各要素はDictionaryEntry構造体(System.Collections名前空間)のオブジェクトとして取り扱われる。なお通常の配列などと異なり、ハッシュテーブルでは格納した要素の順序は保持されない。このためキーや値や要素を列挙した場合に、どのような順で要素が取り出されるかは不定である。

 もしキーも値も文字列に限定できる場合には、StringDictionaryクラス(System.Collections.Specialized名前空間)も便利に使える。このクラスはHashtableクラスをラップし、メソッドやプロパティで扱う型をString型に限定したものだ。End of Article

カテゴリ:クラス・ライブラリ 処理対象:コレクション
使用ライブラリ:Hashtableクラス(System.Collections名前空間)
使用ライブラリ:DictionaryEntry構造体(System.Collections名前空間)
使用ライブラリ:StringDictionaryクラス(System.Collections.Specialized名前空間)
 
この記事と関連性の高い別の.NET TIPS
ハッシュテーブル(連想配列)を使うには?(Dictionaryクラス編)
ハッシュテーブル(Dictionaryクラス)を値でソートするには?
1つのキー文字列に対して複数の文字列値を保持するには?
レジストリのキーを列挙するには?
配列のサイズを変更するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」

更新履歴
【2005/5/26】本記事の一部に以下のような誤りがありました。お詫びして訂正させていただきます。

 指定したキーがハッシュテーブル(この例ではht)に存在しない場合には、新しい要素として登録される。キーがすでに存在する場合には、それに対応する値が置き換えられる。
 指定したキーがハッシュテーブル(この例ではht)に存在しない場合には、新しい要素として登録される。キーがすでに存在する場合には、インデクサではそのキーに対応する値が置き換えられるが、Addメソッドでは例外が発生する。

TechTargetジャパン

Insider.NET フォーラム 新着記事
  • 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 のアプリ・ストアに日々登録されている多種多様なアプリ。カテゴリ別のアプリ数は? 市場の現状を明らかにする

@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

RSSフィード

キャリアアップ

- PR -
@IT Sepcial

イベントカレンダー

PickUpイベント

- PR -
もっと見る
- PR -

お勧め求人情報

ホワイトペーパーTechTargetジャパン

@IT Sepcial
ソリューションFLASH