0

インデックスの作成と呼ぶものについて指示を受けました。

基本的に、ユーザーは空のテキストボックスにテキストを入力できることが期待されます。ボタンをクリックすると、出力には、入力された単語のアルファベット順のリストと、それらが表示される行番号が表示されます。

たとえば、次のようになります。

1匹
2匹
赤魚
青魚。

黒魚
青魚
古い魚
新しい魚。

これは
小さな星があります。

これは小さな車があります。
言う!なんてたくさん
の魚がいるのでしょう。

A
12、14、15 ARE 16
BLACK 6
BLUE 4、7
CAR 14
FISH 1、2、3、4、
HAS 11、14
LITTLE 12、14
LOT 15
NEW 9
of 16
OLD 8
ONE 1、11、14
RED 3
SAY 15
STAR 12
THERE 16
THIS 11、14
TWO 2
WHAT 15

このテキストは、インデックスを作成するためにJavaドキュメントからの参照で使用され、私はそれを実行しました。期待は私のものと同じですが、別の言語で書かれています。

アルゴリズムを練るためにその瞬間に紙に取り組んでいますが、私の努力に少し不満を感じています!

さらにいくつかの要件:

行番号の最大出現回数は4回であるため、単語が10行に出現する場合でも、4回だけ参照する必要があります。

文法は無視する必要があるため、!。、?を含む単語 削除する必要がありますスペルト小麦の単語:HeLlOスペルト小麦である必要があります:こんにちは

助けてくれてありがとう

4

1 に答える 1

1

テキストファイルに表示される順序で単語を表示する必要がある場合は、HashTableからSortedListに変更します。

    Dim hshResults As New Hashtable()

    Dim lstLinesOfText As List(Of String) = IO.File.ReadAllLines("C:\YourFile.txt").ToList()

    Dim intLineCursor As Integer = 0

    For Each strLine As String In lstLinesOfText

        Dim lstWords As List(Of String) = strLine.Split(" ").ToList()

        For Each strWord As String In lstWords

            ProcessWord(strWord, hshResults, intLineCursor)

        Next

        intLineCursor += 1

    Next

    Dim strOutput As String = String.Empty

    For Each o As DictionaryEntry In hshResults

        strOutput += CStr(o.Key) & " "

        Dim lstLinesWhereWordIsFount As List(Of Integer) = CType(o.Value, List(Of Integer))

        For Each i As Integer In lstLinesWhereWordIsFount

            strOutput += CStr(i) & " "

        Next

        'Some cleanup of extra spaces.
        strOutput = Trim(strOutput) & ControlChars.NewLine

    Next

Private Sub ProcessWord(ByVal strWord As String, ByRef hshResults As Hashtable, ByVal intLineIndex As Integer)

    Dim lstLinesWhereWordIsFound As List(Of Integer) = (From o As DictionaryEntry In hshResults _
                                                        Where CStr(o.Key) = strWord _
                                                        Select CType(o.Value, List(Of Integer))).FirstOrDefault()

    If lstLinesWhereWordIsFound Is Nothing Then

        'Add this word.
        Dim lstNewHashTableValue As New List(Of Integer)
        lstNewHashTableValue.Add(intLineIndex + 1) 'Indexes in the programming world start at 0.

        hshResults.Add(CObj(strWord), CObj(lstNewHashTableValue))

    Else

        'Add the line number for this word.
        If lstLinesWhereWordIsFound.Count < 5 Then

            'Make sure we're not duplicating a line number for this word.
            If (From i As Integer In lstLinesWhereWordIsFound _
                Where i = intLineIndex).Count = 0 Then

                lstLinesWhereWordIsFound.Add(intLineIndex + 1)

                hshResults(strWord) = CObj(lstLinesWhereWordIsFound)

            End If

        End If

    End If

End Sub

編集:コードの説明

まず、HashTableをインスタンス化して、単語とそれらが見つかった行を格納します。次に、テキストファイルの各行を(文字列の)リストオブジェクトに入れます。テキストファイルの行を繰り返し処理し、Splitメソッドを使用して、行の各単語を別のList(of String)変数に入れます。行の各単語を、HashTableを適切に更新するメソッド(ProcessWord)を介して送信します。最後に、HashTableのすべてのキーと値のペアを繰り返し処理して、目的の出力を生成します。ProcessWordメソッドのロジックは、最初にその単語がHashTableにすでに存在するかどうかを判断することです。そうでない場合は、単語と行番号を追加します。もしそうなら、行数が4の頻度を超えていないことを確認してください(あなたの質問で要求されているように)、そうでないことを確認してください

于 2012-08-02T21:26:10.943 に答える