Vb.net 如何打印每个字母在字符串中出现的次数?

Vb.net 如何打印每个字母在字符串中出现的次数?,vb.net,Vb.net,我的任务是编写一个程序,从文本框中提取一个字符串,并打印每个字母在字符串中出现的次数。请注意,这是在简单的代码 下面是我的代码,但我的问题是它不能忽略已打印的字符。e、 g.如果字符串是“aaaaa”,它必须只打印一行,表示“a出现5次”,而不是5行,表示相同的内容 Dim str As String = TextBox1.Text Dim tempStr As String Dim a, c, k As Integer For k = 1 To Len(str) tempStr =

我的任务是编写一个程序,从文本框中提取一个字符串,并打印每个字母在字符串中出现的次数。请注意,这是在简单的代码

下面是我的代码,但我的问题是它不能忽略已打印的字符。e、 g.如果字符串是“aaaaa”,它必须只打印一行,表示“a出现5次”,而不是5行,表示相同的内容

Dim str As String = TextBox1.Text
Dim tempStr As String
Dim a, c, k As Integer

For k = 1 To Len(str)
    tempStr = Mid(str, k, 1)
    c = 0
    For a = 1 To Len(str)
        If Mid(str, a, 1) = tempStr Then
            c += 1
        End If
    Next
    Console.WriteLine(tempStr & " appears " & c & " times.")
Next

您有两个循环:外部循环用于选择字母;以及一个内部循环,用于测试字母在文本框字符串中出现的次数

您的问题是外部循环也在从字符串本身选择其字母。这样,字符串中的任何重复字母都意味着重复输出

相反,您应该从整套符号中选择字母-通常是
'
'~'
。但是你必须为那些根本没有出现的符号添加额外的代码:如果计数为零,就不要打印任何东西


请注意,这并不是一种非常有效的方法—您正在多次扫描文本框字符串—但它肯定足够快。

您有两个循环:外部循环用于选择字母;以及一个内部循环,用于测试字母在文本框字符串中出现的次数

您的问题是外部循环也在从字符串本身选择其字母。这样,字符串中的任何重复字母都意味着重复输出

相反,您应该从整套符号中选择字母-通常是
'
'~'
。但是你必须为那些根本没有出现的符号添加额外的代码:如果计数为零,就不要打印任何东西

请注意,这不是一种非常有效的方法-您正在多次扫描文本框字符串-但速度肯定足够快。

更新以解决您的评论: 代码的问题是,您没有任何东西可以跟踪哪些字母已被计数和打印,这样它们就不会再次被计数

要跟踪所使用的字母,可以使用
列表(字符)
或使用字典库解决方案,如下图所示。但是,既然你说你不能使用列表或字典,这里有一个解决办法:只在字母不存在于字符串的其余部分(在外循环中)时计算(并打印)字母。这样,您可以保证重复的部分将被忽略

下面的示例使用了两个与代码类似的嵌套循环:

For i = 0 To str.Length - 1
    Dim currentLetter As Char = str(i)
    'Dim currentLetter As String = str.Substring(i, 1)  ' If you don't want to use Char.

    ' If the letter exists in the rest of the string, ignore it and continue.
    If str.Substring(i + 1).Contains(currentLetter) Then Continue For

    Dim count As Integer = 0
    For j = 0 To str.Length - 1
        If str(j) = currentLetter Then count += 1
        'If str.Substring(j, 1) = currentLetter Then count += 1 ' If you don't like Char.
    Next

    Console.WriteLine("The letter {0} appears {1} times in the string.",
                      currentLetter, count)
Next
一些评论:

For Each c As Char In str
    dictLetters(c) = If(dictLetters.ContainsKey(c), dictLetters(c), 0) + 1
Next
  • 不建议使用
    Mid()
    。相反,如果只需要一个字符,可以使用
    str(index)

  • 类似地,
    Len()
    也是为了向后兼容而存在的。相反,您应该使用
    str.Length


原始答复: 使用a跟踪字母的计数,然后显示计数:

Dim str As String = TextBox1.Text
Dim dictLetters As New Dictionary(Of Char, Integer)

For Each c As Char In str
    If dictLetters.ContainsKey(c) Then
        dictLetters(c) += 1
    Else
        dictLetters(c) = 1
    End If
Next

For Each pair In dictLetters
    Console.WriteLine("The letter {0} appears {1} times in the string.", 
                      pair.Key, pair.Value).
Next
较短版本:

For Each c As Char In str
    dictLetters(c) = If(dictLetters.ContainsKey(c), dictLetters(c), 0) + 1
Next
更新以回应您的评论: 代码的问题是,您没有任何东西可以跟踪哪些字母已被计数和打印,这样它们就不会再次被计数

要跟踪所使用的字母,可以使用
列表(字符)
或使用字典库解决方案,如下图所示。但是,既然你说你不能使用列表或字典,这里有一个解决办法:只在字母不存在于字符串的其余部分(在外循环中)时计算(并打印)字母。这样,您可以保证重复的部分将被忽略

下面的示例使用了两个与代码类似的嵌套循环:

For i = 0 To str.Length - 1
    Dim currentLetter As Char = str(i)
    'Dim currentLetter As String = str.Substring(i, 1)  ' If you don't want to use Char.

    ' If the letter exists in the rest of the string, ignore it and continue.
    If str.Substring(i + 1).Contains(currentLetter) Then Continue For

    Dim count As Integer = 0
    For j = 0 To str.Length - 1
        If str(j) = currentLetter Then count += 1
        'If str.Substring(j, 1) = currentLetter Then count += 1 ' If you don't like Char.
    Next

    Console.WriteLine("The letter {0} appears {1} times in the string.",
                      currentLetter, count)
Next
一些评论:

For Each c As Char In str
    dictLetters(c) = If(dictLetters.ContainsKey(c), dictLetters(c), 0) + 1
Next
  • 不建议使用
    Mid()
    。相反,如果只需要一个字符,可以使用
    str(index)

  • 类似地,
    Len()
    也是为了向后兼容而存在的。相反,您应该使用
    str.Length


原始答复: 使用a跟踪字母的计数,然后显示计数:

Dim str As String = TextBox1.Text
Dim dictLetters As New Dictionary(Of Char, Integer)

For Each c As Char In str
    If dictLetters.ContainsKey(c) Then
        dictLetters(c) += 1
    Else
        dictLetters(c) = 1
    End If
Next

For Each pair In dictLetters
    Console.WriteLine("The letter {0} appears {1} times in the string.", 
                      pair.Key, pair.Value).
Next
较短版本:

For Each c As Char In str
    dictLetters(c) = If(dictLetters.ContainsKey(c), dictLetters(c), 0) + 1
Next

看不出有什么问题。您的代码正按照您的要求执行。尝试单步遍历代码,看看它实际上在做什么。然后尝试几个不同的测试用例——这会让你更清楚。我理解我的代码在做什么,问题说明了一切。我的帖子要求帮助代码完成需要完成的事情,而不是我让代码完成的事情。发布我的代码是为了展示我在VB中的知识水平所做的努力,而不是说这是一个完整的解决方案看不到问题。您的代码正按照您的要求执行。尝试单步遍历代码,看看它实际上在做什么。然后尝试几个不同的测试用例——这会让你更清楚。我理解我的代码在做什么,问题说明了一切。我的帖子要求帮助代码完成需要完成的事情,而不是我让代码完成的事情。发布我的代码是为了展示我在VB方面的知识水平,并不是说它是完整的解决方案。感谢您编写的代码。然而,我的任务是在不使用预定义词汇的情况下完成,因为我们还没有被教过。VB.NET中只有donr循环和嵌套循环。如果我将代码复制到一个新按钮,下面的一行会给出一个错误:
Console.WriteLine($“字母{pair.Key}在字符串中出现{pair.Value}次。”)–
字符$被认为不是valid@BlessingHwacha如果字符
$
无法识别,那么您使用的是旧的VB版本。您可以将其替换为
Console.WriteLine(“字母{0}在字符串中出现{1}次。”,pair.Key,pair.Value)