0

我被指示创建一个索引。

基本上,用户应该能够在空文本框中纠正一些文本。单击按钮后,输出应显示按字母顺序排列的输入单词列表,以及它们出现的行号。

例如:

一鱼
二鱼
红鱼
蓝鱼。

黑鱼
蓝鱼
老鱼
新鱼。

这个有
小星星。

这个有一辆小车。
说!有多少
鱼。

A 12, 14, 15
是 16
黑色 6
蓝色 4, 7
车 14
鱼 1, 2, 3, 4,
有 11, 14
小 12, 14
很多 15
新 9
个 16
旧 8
一个 1, 11, 14
红色 3
说15
星 12
那里 16
这 11, 14
二 2
什么 15

该文本是参考 Java 文档创建索引时使用的,我遵循了它,期望与我的相同,只是用另一种语言。

我现在正在写论文以制定算法,但我对自己的努力感到有些沮丧!

还有几个要求:

行号出现的最大数量是 4,因此即使一个单词出现在 10 个不同的行上,它也应该只被引用 4 次

语法必须被忽略,所以包含 !.,? 必须删除拼写为 :HeLlO 的单词必须拼写为: 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 来存储找到它们的单词和行。然后我将文本文件的每一行放入一个 List(of String) 对象中。遍历文本文件的行,我使用 Split 方法将行中的每个单词放入另一个 List(of String) 变量中。我通过一个方法 (ProcessWord) 发送该行的每个单词,该方法将适当地更新 HashTable。最后,我遍历 HashTable 中的所有键/值对以生成所需的输出。ProcessWord 方法的逻辑是首先判断单词是否已经存在于HashTable 中。如果没有,请添加单词和行号。如果是这样,请确保行数不高于 4 的频率(如您的问题中所要求的那样),确保它不

于 2012-08-02T21:26:10.943 回答