2016-09-19 4 views
0

私は単純なライブラリデータベースシステムのための「検索エンジン」(sorta)を作成しようとしています。リストボックスに重複をカウントして別のリストボックスに追加します

本当にやりたいことの簡単な説明として、書籍に関連付けられた「タグ」を検索するアクセスデータベースに接続された検索エンジンプログラムを作成したいと考えています。

タグ(またはキーワード)は、検索ボックスで使用できるオプションです。そのため、名前を検索する代わりに、本自体のタグを検索することができます。タグには、書籍や軽小説などの書籍のテーマから何でも含めることができます。

例:「ホラー」と「ホラー」の書籍それらのタグはリストボックスにリストされます。

これは問題ありませんが、検索エンジンとしては十分正確ではありません。現在のコードでは、特定の書籍と一致するタグを入力するとすぐにそれが表示されます。私が「ホラーアドベンチャー」をタイプすると、それに恐怖を感じている本のリストが表示されるので、それだけでは具体的ではありません。

私のコードは、検索入力をスペースに基づいて分割します。タグそのものでは、タグはコンマで区切られています。データベース上では、たとえば、「ホラー、アドベンチャー、ロマンス」というタグが表示されます。次に、それらは両方とも2つのForループで反復され、各分割検索文字列を分割タグ文字列と比較します。それが一致した場合、それはそれを追加します それがあるためのコード:。

Dim comparenew As String 
    Dim splittag As String 
    For Each comparenew In search 
     For Each splittag In compare 
     If splittag.Contains(comparenew) = True And comparenew <> "" And comparenew.Count <> 1 Then 
     If Not frmList.lstBooks.Items.Contains(dr("BookName").ToString()) Then 
      frmList.lstBooks.Items.Add(dr("BookName").ToString()) 
     End If 
     End If 
    Next 
    Next 
Next 

通常、これはリストに追加され、同じブックの複数のインスタンスになるだろうが、私はすでにの防止を追加しましたリストボックスに重複しています。これは「if not」ステートメントです。

しかし、私はこの重複を精度の尺度として利用したいと思います。重複が多いほど、検索結果が向上します。

ユーザーが重複したアイテムを最大2つまで検索したとします。 2つの重複した項目が最初に他のリストボックスに追加され、最後に残りの重複した項目が追加されます。

これはちょっと混乱します。これは、リストボックスに「最も重複した」アイテムが追加されるとは限らないことを意味します。また、重複カウントも少なくなります。 「ラブコメディー冒険物語を、タイムトラベルと」: のは、ユーザーが検索することを言ってみましょう:

はここで別の例です。

5冊 "" と、 "コメディー"、 "アドベンチャー"、および "タイムトラベル" と一致します。 これらは自動的にリストに追加されます。 "コメディー"、 "アドベンチャー"、および "タイムトラベル" 試合で

2冊(これは、これらの5冊の本が4回ずつ重複してしまったことを意味します)。彼らはリストに(これは、これらの2冊の本が3回ずつ重複してしまったことを意味します)

10冊 "" と、 "コメディー"、および「アドベンチャーを追加している "と一致します。 は、彼らはまた、 "" と

25冊(3つの重複それぞれに10冊)リストにを追加し、 "コメディ" 一致しています。 しかし、彼らがリストに追加されていない(彼らは唯一の2回複製された)

がうまくいけば、誰もが一例を理解することができ、私はそれが少し明らかだったと思います。あなたが見ることができるように、アイテムの中で最も重複していないにもかかわらず、結果が追加される「レベル」があります。それはちょうど1つのカウントですが、それはコードをどのように記述するのかわからないので、それは検索エンジンの問題です。私は重複を最初に数え、それを比較のためにArrayに置くことを考えていました。私はあまりにもコードがこれのためにどのように動作するのか分からない。

これで私を助けることができる人はいますか?あなたがコードを必要としているかどうかを教えてください。私は似たようなものを探すことを試みましたが、重複を数えたり、単純にそれらを取り除いただけの結果しか見つかりませんでした。

+0

こんにちは、歓迎するスタックオーバーフロー!どんなことが起こっているのか、結果を望みたいのかについての徹底的な説明を書いたことは非常に良いことですが、私たちがあなたの説明を「コード通り」で再考するのは少し難しいです。これを行う。したがって、これはもっと議論につながる可能性があります。また、Stack OverflowはQ&Aサイトであるため、議論を避けて、簡単に調べることができます(つまり、ほとんどの場合_includeコード)。 [最小限で完全で検証可能なサンプルの作成方法](http://stackoverflow.com/help/mcve)を参照してください。 –

+0

将来のためのもう少しの注意:_Tags_であると考えられているので、プログラミング言語などをタイトルに含めないでください(実際にそこに収まらない場合)セクション。 [this](http://meta.stackexchange.com/a/130208)を参照してください。 –

+0

ヒントをありがとう!私はレビューのために投稿を修正しましたが、問題を理解したようでしたので、代わりに他の人の参考にして投稿します。 – Basher

答えて

1

OKこの質問を投稿した後、私は自分の問題を解決することができたので、私はこれについて精神的なブロックを持っていたと思う。

リストボックスの重複数を「カウント」する方法としてthis code hereを使用して、私はそれをスイートに少し変更しました。

まず、「Max」という変数を追加して、最も重複した数を取得しました。その後、重複の数が "Max" -1以上であれば、if文を追加しました。それで、リストボックスに上位2つの重複を得ることができました。ここには、変更されたコードがあります。

Try 
     For Each nItem As String In lBox.Items 
      If Not (lItems.ContainsKey(nItem)) Then 
       strCurrentItem = nItem 
       For Each sItem As String In lBox.Items 
        If sItem.Equals(strCurrentItem) Then 
         intCount += 1 
        End If 
       Next 
       If max < intCount Then 
        max = intCount 
       End If 
       lItems.Add(nItem, intCount) 
       intCount = 0 
       strCurrentItem = String.Empty 
      End If 
     Next 

     For i As Integer = 0 To lItems.Count - 1 
      If lItems.Values(i) >= max - 1 Then 
       frmList.lstBooks.Items.Add(lItems.Keys(i).ToString) 
      End If 
     Next 
関連する問題