0

我试图弄清楚如何让消息框仅显示文本文件中的特定单词,该文件包含字典中的所有单词。我尝试了各种不同的方法,但无法让它发挥作用,但我确实认为我走在正确的轨道上,所以只需要一些指示。

基本上,有一个加扰的字符串,每次都不同,并且包含在标签中。我希望程序只显示包含加扰字符串中字母的单词,但不知道如何实现这一点?

这是我到目前为止的代码:

Private Sub btnAnswers_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAnswers.Click

    Dim hash As List(Of String) = New List(Of String)(System.IO.File.ReadAllLines("C:\Users\Katie\Documents\Project\dictionary.txt"))
    Dim Letters As String
    Dim OneCharacter As String
    Dim Found As Boolean
    Dim item As String
    Dim AllCharacters As String

    Found = False
    Letters = lblLetters.Text

    For i = 0 To Letters.Length - 1
        OneCharacter = Letters.Substring(i, 1)
        For Each item In hash
            If item.Contains(OneCharacter) Then
                Found = True
                AllCharacters = OneCharacter
            Else
                Found = False
            End If
            MsgBox(item)
        Next
    Next i
End Sub

消息框确实显示了字典中的单词,但是单词可以包含标签字符串中不存在的字母,所以我的代码是错误的。任何人都可以帮忙吗?抱歉,但我是编程新手。

4

3 回答 3

1

正如 Steven Doggart 所建议的,您必须反转循环嵌套。您想要的是浏览所有字典条目,并为每个条目检查它是否包含字符串中的所有字母。您的循环结构不允许这样做。

我已在您的代码中执行了所需的更新。请记住,此代码忽略大写字母(“A”与“a”相同)。

Private Sub btnAnswers_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    Dim hash As List(Of String) = New List(Of String)(System.IO.File.ReadAllLines("C:\Users\Katie\Documents\Project\dictionary.txt"))
    Dim Letters As String = lblLetters.Text
    For Each item As String In hash
        Dim Found As Boolean = True
        For i = 0 To Letters.Length - 1
            Dim OneCharacter As String = Letters.Substring(i, 1)
            Dim itemToLower As String = item.ToLower()
            If Not itemToLower.Contains(OneCharacter.ToLower()) Then
                Found = False
                Exit For
            End If
        Next i
        If (Found) Then
            'The given dictionary entry includes all the letters in the label. No more iterations will be performed
            MsgBox(item)
            Exit For
        End If
    Next
End Sub

此代码查找包含给定标签中所有字符的键(不是相反),即:使用标签“dict”,“dictentry”是正确的。

无论如何,我回答的重点不是提供您只需要执行的代码;这段代码的重点是帮助您了解您做错了什么以及如何开始正确地做事。如果您对这个确切的功能不感兴趣,您必须编辑我的代码,以便可以完成您想要的;或者,理想情况下,您将完全从头开始编写自己的代码。

于 2013-07-23T16:58:28.627 回答
1

通过对上一个答案的简单修改,您可以将输出限制为仅包含仅包含加扰字母的单词:

Private Sub btnAnswers_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    Dim hash As List(Of String) = New List(Of String)(System.IO.File.ReadAllLines("C:\Users\Katie\Documents\Project\dictionary.txt"))
    Dim Letters As String = lblLetters.Text
    For Each item As String In hash
        Dim word As String = item.ToLower()
        For i = 0 To Letters.Length - 1
            Dim OneCharacter As Char = Char.ToLower(Letters(i))
            While word.Contains(OneCharacter)
                word = word.Remove(word.IndexOf(OneCharacter), 1)
            End While
        Next
        If (word.Length = 0) Then
            'The given dictionary entry includes all the letters in the label. No more iterations will be performed
            MsgBox(item)
            Exit For
        End If
    Next
End Sub

使用此代码,如果加扰的字母包含“bok”,则将选择“book”。但是,删除 while 循环并仅保留 remove 语句,将确保只有每个不同字母的确切数字会匹配。所以需要'obok'来匹配“book”。

于 2013-07-23T18:38:59.297 回答
0

您在MsgBox(item)确定当前单词是否包含当前字符的 if 语句之外调用。这意味着它会弹出每个字母,每个单词。如果您只想MsgBox(item)在单词中实际找到字母时显示 if 语句的前半部分,请移到 if 语句的前半部分。

我还建议遵循 Steven Doggart 的建议并扭转循环嵌套的方式。如果字符是外循环,则每个单词可以多次获取消息框(例如,如果您的字母是“sdf”并且其中一个单词是“foods”,它将弹出 3 次)。

For Each item In hash
    For i = 0 To Letters.Length - 1
        OneCharacter = Letters.Substring(i, 1)
        If item.Contains(OneCharacter) Then
            Found = True
            AllCharacters = OneCharacter
            MsgBox(item)
        Else
            Found = False
        End If
    Next
Next
于 2013-07-23T16:57:11.607 回答