C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[5]: HashTableについて


(過去ログ 10 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■1886 / inTopicNo.1)  HashTableについて
  
□投稿者/ ちぃ (1回)-(2007/03/08(Thu) 10:55:15)

分類:[VB.NET (Windows)] 

現在Microsoft Visual Basic .NET 2003 で開発をしています。
そこで、HashTableに関して質問なのですが、
下記のようなキーと値を順にHashTableに格納していくと、
構造はこうなります。

キー:値
aa :1
bb :2
cc :3
dd :4

HashTable:htに格納すると、
ht-(0)key:cc
| val:3
-(1)key:aa
| val:1
-(2)key:bb
| val:2
-(3)key:dd
val:4
上記のように、インデックスがバラバラになってしまいます。
これを、
ht-(0)key:aa
| val:1
-(1)key:bb
| val:2
-(2)key:cc
| val:3
-(3)key:dd
val:4
格納した順にインデックスを振ることは不可能ですよね?
いろいろ調べ無理そうでしたが、はっきり無理とわかれば
諦めもつくので、よろしくお願いします。
引用返信 編集キー/
■1887 / inTopicNo.2)  Re[1]: HashTableについて
□投稿者/ はつね (100回)-(2007/03/08(Thu) 11:07:04)
はつね さんの Web サイト
No1886 (ちぃ さん) に返信
> 現在Microsoft Visual Basic .NET 2003 で開発をしています。
> そこで、HashTableに関して質問なのですが、
> 下記のようなキーと値を順にHashTableに格納していくと、
> 構造はこうなります。
>
> キー:値
> aa :1
> bb :2
> cc :3
> dd :4

HashTableとはHash関数によりキー値を対応するHash値に変換する事で、キーを指定してテーブルの中から1つのものを効率よく取り出すための仕組みです。そして、このHash関数は「入れた順番をIndexにする」というような仕組みにはなっていませんので、ご希望の動作はできません。

引用返信 編集キー/
■1889 / inTopicNo.3)  Re[1]: HashTableについて
□投稿者/ シャノン (104回)-(2007/03/08(Thu) 11:09:21)
No1886 (ちぃ さん) に返信
> 格納した順にインデックスを振ることは不可能ですよね?

はい。
Hashtableはアイテムの順序を保証しません。

キーがstringでいいなら、NameObjectCollectionBaseの派生クラスを作ればいけるかも。
キーも任意の型にしたい場合でも、順序を記憶するコレクションを自作することはできるでしょう。
引用返信 編集キー/
■1890 / inTopicNo.4)  Re[2]: HashTableについて
□投稿者/ ちぃ (3回)-(2007/03/08(Thu) 11:12:08)
> HashTableとはHash関数によりキー値を対応するHash値に変換する事で、キーを指定してテーブルの中から1つのものを効率よく取り出すための仕組みです。そして、このHash関数は「入れた順番をIndexにする」というような仕組みにはなっていませんので、ご希望の動作はできません。

そうですよね。
キーを指定して値を取り出せるのが利点ですもんね。
他のコレクションで考えたいと思います。
ありがとうございました。
解決済み
引用返信 編集キー/
■1891 / inTopicNo.5)  Re[3]: HashTableについて
□投稿者/ ぼのぼの (18回)-(2007/03/08(Thu) 11:19:04)
スマートな方法かどうかはわかりませんが、
以前、クラスを自分で作るのがめんどくさかったので、
1行のDataTableで代用したことがありました。

Dim dt As New DataTable
dt.Columns.Add("aa")
dt.Columns.Add("bb")
dt.Columns.Add("cc")
dt.Columns.Add("dd")
Dim dr As DataRow = dt.NewRow()
dr("aa") = 1
dr("bb") = 2
dr("cc") = 3
dr("dd") = 4

解決済み
引用返信 編集キー/
■1894 / inTopicNo.6)  Re[4]: HashTableについて
□投稿者/ aoa (17回)-(2007/03/08(Thu) 12:41:50)
2007/03/08(Thu) 12:56:35 編集(投稿者)
こんにちは

手抜きですが、私ならこのようにして
HashTableを継承したクラスにToArrayメソッドを持たせます。
Public Class Form1
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim table As New Hashtable()
        With table
            .Add("aa", New Item(1, 0))
            .Add("bb", New Item(2, 1))
            .Add("cc", New Item(3, 2))
            .Add("dd", New Item(4, 3))
        End With
        Dim arr(table.Count - 1) As Object
        Dim counter As Integer = 0
        For Each obj As Object In table.Values
            arr(counter) = DirectCast(obj, Item)
            counter += 1
        Next
        Array.Sort(arr)
    End Sub
End Class

Public Class Item
    Implements IComparable
    Private _index As Integer
    Private _value As Object
    Public Sub New(ByVal value As Object, ByVal index As Integer)
        Me._index = index
        Me._value = value
    End Sub
    Public ReadOnly Property Value() As Object
        Get
            Return _value
        End Get
    End Property
    Public Function CompareTo(ByVal obj As Object) As Integer Implements System.IComparable.CompareTo
        Dim other As Item = DirectCast(obj, Item)
        Return Me._index - other._index
    End Function
End Class



解決済み
引用返信 編集キー/
■1924 / inTopicNo.7)  Re[5]: HashTableについて
□投稿者/ なちゃ (27回)-(2007/03/08(Thu) 19:35:22)
2005ならOrderedDictionaryっていうほぼそのままの機能があるんですけどね…

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -