tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルコレクションとハッシュテーブル
記事No4712
投稿日: 2006/12/20(Wed) 16:16
投稿者へるぷ・みぃ
何が違うのですか?

『あるキーを渡して、対応する値を取得する』という機能を実現したい場合、
どちらを使う方が良いですか?

' コレクションの場合
Dim col As New Collection
col.Add("1111", "a")
col.Add("2222", "b")
col.Add("3333", "c")
Debug.Print(CStr(col("c")))
Debug.Print(CStr(col("a")))

' ハッシュテーブルの場合
Dim hush As New Hashtable
hush.Add("a", "1111")
hush.Add("b", "2222")
hush.Add("c", "3333")
Debug.Print(CStr(hush("c")))
Debug.Print(CStr(hush("a")))

[ツリー表示へ]
タイトルRe: コレクションとハッシュテーブル
記事No4718
投稿日: 2006/12/20(Wed) 19:58
投稿者魔界の仮面弁士
> Dim hush As New Hashtable
「hush」だと、意味が変わってしまうような。

> Debug.Print(CStr(hush("c")))
コードの記述からして、VB2005 ですね?


> 何が違うのですか?
HashTable は、キーによる管理を行うためのクラスです。
ArrayList は、順序による管理を行うためのクラスです。
Collection は、順序による管理を重視しますが、キーによる管理もできます。


そもそも、Microsoft.VisualBasic.Collection の方は、キー指定は必須ではありませんが、
System.Collections.Hashtable は、キー指定が必須となっています。これが最大の違いです。

そのため Collection では、キーを指定して取得するだけでなく、「3番目の要素」といった、
位置指定での値取得が可能になっていますし、Add メソッドの Before/After 引数によって、
位置指定での値登録も可能となっています。
一方の HashTable は、キー主体で管理され、登録順についての指定はできません。


それから、登録された値の扱いも異なります。
Collection の場合、代入した値は固定的で、後から変更することが出来ませんが、
HashTable の方は、登録済みの値を変更することができます。

このため、HashTable では、
 hash("d") = "4444"
という「値の代入」が可能ですが、Collection で値を変更するには、
それを一度削除してから、再度登録しなおすという手順が必要となります。


それと、データの列挙時にも違いがあります。
Collection の内容を列挙する場合には、
  For I As Integer = 1 To col.Count
    Debug.Print("value={0}", col(I))
  Next
のように、「For 〜 Next」による、位置指定での『値の列挙』と、
  For Each o As Object In col
    Debug.Print("value={0}", o)
  Next
のように、「For Each 〜 Next」による『値の列挙』が可能です。
しかし「キーの列挙」機能は、持ち合わせていません。


一方、HashTable の場合は、「For 〜 Next」による指定ができません。そのかわりに、
  For Each o As DictionaryEntry In hash
    Debug.Print("key={0}, value={1}", o.Key, o.Value)
  Next
のように、値とキーを同時に列挙できますし、
  For Each o As Object In hash.Values
    Debug.Print("value={0}", o)
  Next
  For Each o As Object In hash.Keys
    Debug.Print("key={0}", o)
  Next
のように、キーと値を個別に列挙することもできます。



> 『あるキーを渡して、対応する値を取得する』という機能を実現したい場合、
> どちらを使う方が良いですか?

どちらでもなく、System.Collections.Generic.Dictionary の使用をオススメします。

[ツリー表示へ]
タイトルRe^2: コレクションとハッシュテーブル
記事No4719
投稿日: 2006/12/21(Thu) 09:35
投稿者へるぷ・みぃ
> > Dim hush As New Hashtable
> 「hush」だと、意味が変わってしまうような。

(-"-) うっ
書き間違いです・・・(-ノ。-)

> > Debug.Print(CStr(hush("c")))
> コードの記述からして、VB2005 ですね?

はい。
おっしゃる通り。

> どちらでもなく、System.Collections.Generic.Dictionary の使用をオススメします。

System.Collections.Generic.Dictionary(Of String, String)
で出来ました〜♪
この方法なら、毎回 CStr 関数を使用しなくてすみます。


ありがとございました ○┐ぺこりん

[ツリー表示へ]