ハッシュテーブル(連想配列)を使うには?

ハッシュテーブルとは、キー(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)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值