【问题标题】:Creating an "Index" report based on user entered text - VB 2010根据用户输入的文本创建“索引”报告 - VB 2010
【发布时间】:2012-08-02 20:33:31
【问题描述】:

我被指示创建索引。

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

例如:

一条鱼
两条鱼
红鱼
蓝色的鱼。

黑鱼
蓝鱼
老鱼
新鱼。

这个有
一颗小星星。

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

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

感谢您的帮助

【问题讨论】:

  • 到目前为止你有没有尝试过?
  • 嗨乔瓦尼,不只是现在,我首先考虑算法,我来这里是为了了解从哪里开始并帮助彻底考虑问题

标签: vb.net dictionary indexing richtextediting


【解决方案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 的频率(如您的问题中所要求的),确保它不会两次放置相同的行号(以防一个单词在同一行中多次次),如果满足所有这些条件,则添加行号,然后更新 HashTable。

【讨论】:

  • 您好,非常感谢您的回答,您有什么办法可以扩展代码来解释它的作用吗?我部分理解它,但是我的编程知识并不好,因为我还在学习!谢谢
  • 非常感谢您的帮助,我会努力实现它并在明天回复您,干杯!
  • 这段代码没有输出功能?我试图了解输出在屏幕上的位置以查看
  • 你看到 strOutput 了吗?随心所欲地显示它。第一个代码块将进入按钮的点击事件。
  • 很高兴我能帮上忙。如果这是对您问题的正确答案,请单击旁边的复选标记将其标记为正确答案。
猜你喜欢
  • 2021-12-12
  • 1970-01-01
  • 1970-01-01
  • 2022-10-22
  • 1970-01-01
  • 1970-01-01
  • 2015-08-14
  • 1970-01-01
  • 2018-03-12
相关资源
最近更新 更多