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

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

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.1886 の関連記事表示

<< 0 >>
■1886  HashTableについて
□投稿者/ ちぃ -(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
    格納した順にインデックスを振ることは不可能ですよね?
    いろいろ調べ無理そうでしたが、はっきり無理とわかれば
    諦めもつくので、よろしくお願いします。
親記事 /過去ログ10より / 関連記事表示
削除チェック/

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

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

    キーがstringでいいなら、NameObjectCollectionBaseの派生クラスを作ればいけるかも。
    キーも任意の型にしたい場合でも、順序を記憶するコレクションを自作することはできるでしょう。
記事No.1886 のレス /過去ログ10より / 関連記事表示
削除チェック/

■1887  Re[1]: HashTableについて
□投稿者/ はつね -(2007/03/08(Thu) 11:07:04)
>
    No1886 (ちぃ さん) に返信
    > 現在Microsoft Visual Basic .NET 2003 で開発をしています。
    > そこで、HashTableに関して質問なのですが、
    > 下記のようなキーと値を順にHashTableに格納していくと、
    > 構造はこうなります。
    >
    > キー:値
    > aa :1
    > bb :2
    > cc :3
    > dd :4

    HashTableとはHash関数によりキー値を対応するHash値に変換する事で、キーを指定してテーブルの中から1つのものを効率よく取り出すための仕組みです。そして、このHash関数は「入れた順番をIndexにする」というような仕組みにはなっていませんので、ご希望の動作はできません。
記事No.1886 のレス /過去ログ10より / 関連記事表示
削除チェック/

■1890  Re[2]: HashTableについて
□投稿者/ ちぃ -(2007/03/08(Thu) 11:12:08)
    > HashTableとはHash関数によりキー値を対応するHash値に変換する事で、キーを指定してテーブルの中から1つのものを効率よく取り出すための仕組みです。そして、このHash関数は「入れた順番をIndexにする」というような仕組みにはなっていませんので、ご希望の動作はできません。

    そうですよね。
    キーを指定して値を取り出せるのが利点ですもんね。
    他のコレクションで考えたいと思います。
    ありがとうございました。
記事No.1886 のレス / END /過去ログ10より / 関連記事表示
削除チェック/

■1891  Re[3]: HashTableについて
□投稿者/ ぼのぼの -(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
    
記事No.1886 のレス / END /過去ログ10より / 関連記事表示
削除チェック/

■1894  Re[4]: HashTableについて
□投稿者/ aoa -(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


記事No.1886 のレス / END /過去ログ10より / 関連記事表示
削除チェック/

■1924  Re[5]: HashTableについて
□投稿者/ なちゃ -(2007/03/08(Thu) 19:35:22)
    2005ならOrderedDictionaryっていうほぼそのままの機能があるんですけどね…
記事No.1886 のレス /過去ログ10より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -