掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
ハッシュテーブルの検索について (ID:124388)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
先の回答は、「全部を列挙して探し出す手法」だと効率が悪すぎるので、 データの格納形式を見直して、「10桁」のコードでも検索しやすいような 作り方をする必要があるでしょう。。。という話になっていますよね? でもって、その格納形式の提案として、HastTable を使って階層的に 管理する、という手法を提案したわけですが。 まず、ここまでの点で何か問題はありますか? もしもデータの格納形式を変更できないようであれば、この話は 振り出しに戻ってしまうわけですが。。。 > Hash14のキーを羅列しないといけないのでしょうか? それは、「6件のサンプルデータ」を作っている部分なので、 『データの検索』という処理とは、直接は関係無いような。 もちろん、『階層データを作成』するためには、最終的には30万件分の データを登録するために、30万回(あるいはそれ以上)のキー登録が 必要ですが、それは先の Hash14 なサンプルであれ、最初に卓郎さんが書いた > For Each ht As DictionaryEntry In hashTest > if Mid(ht.Key, 1, 10) = "1234567890" > '値の出力 > end if > Next という「hashTest」という変数を使った既存のプログラムでも同じこと、ですよね? # そもそも、元のデータがどこから得られるのかも不明なので、これ以上はどうにも。 # 「30万件」の元データが、最初から Hashtable形式で渡されるのか、 # データベースやファイル等で渡されるのか……あるいは、測定器等から # 少しずつ送られてくるのかなど、データの受け渡し方によっては、 # もしかしたら適切な手法が変わるかも知れないわけで。 > たとえばhash14を全部読み込んだ後、たとえばHash14のキー先頭10バイトが > "1111111111"の場合、hash10の"1111111111"の値とするというようなことは > 出来ないのでしょうか? 質問の意図がよくわからないのですが……早い遅いではなく、出来るか出来ないかと 問われるのであれば、技術的には「できる」という答えになるでしょうけれどね。 最終的に、それを実際に作れるかどうかは、卓郎さんの力量次第という事になるような。 たとえば、管理しやすくするために、HashTable を継承した独自のクラスを作り、 そこに、各データを(先に提示したように)「階層化」して持たせる事や、さらに そのクラスに、データの登録や検索を行うメソッドを持たせてみても良いでしょう。 (階層化した場合の検索の方法などは、既にサンプルが提示されているのですし) もしくは、既に提案されていた SortedList を使ってみるのであれば、 データがソートされて格納される事を利用して。。。こんな感じかなぁ。 ===================== Dim X As New SortedList '--- サンプルデータ --- X.Add("1234567890", "") 'データの作成時には、検索用に「10桁部」だけの X.Add("1111111111", "") '情報も、一緒に格納しておくようにする。 X.Add("12345678901111", "あ") X.Add("11111111112222", "い") X.Add("12345678903333", "う") X.Add("11111111111111", "え") 'これらは、SortedList内に X.Add("11111111113333", "お") '格納される際に、キー順に X.Add("12345678902222", "か") 'データが並び替えられる。 '--- 検索 --- Trace.WriteLine("先頭が 1234567890 の物") For Each V As String In Search(X, "1234567890") Trace.WriteLine(V) Next Trace.WriteLine("先頭が 1111111111 の物") For Each V As String In Search(X, "1111111111") Trace.WriteLine(V) Next ===================== Private Function Search(ByVal List As SortedList, ByVal SearchWord As String) As ArrayList '「10桁」だけのデータの位置を探す Dim Position As Integer = List.IndexOfKey(SearchWord) Search = New ArrayList If Position >= 0 Then '10桁だけのデータが見つかったら、その次の位置から検索開始 For Index As Integer = Position + 1 To List.Count - 1 Dim Key As String = CStr(List.GetKey(Index)) If Key.StartsWith(SearchWord) Then '先頭部が一緒なら、戻り値に追加 Search.Add(List.GetByIndex(Index)) Else '先頭部が異なれば、列挙終了 Exit For End If Next End If End Function
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2020 Takeshi Okamoto All Rights Reserved.