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

时间:2018-10-14 04:37:43

标签: vb.net

我有一个任务要编写一个程序,该程序从TextBox中获取一个字符串,并打印每个字母出现在字符串中的次数。请注意,这应使用简单的代码。

下面是我的代码,但是我的问题是它不能忽略已经打印的字符。例如如果字符串是“ 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

2 个答案:

答案 0 :(得分:2)

更新以发表您的评论:

您的代码存在的问题是,您没有什么可跟踪哪些字母已被计数和打印,从而不会再次对其进行计数。

要跟踪使用的字母,可以使用类似List(Of Char)的东西,也可以使用基于字典的解决方案,如下所示。但是,由于您说过不能使用列表或字典,因此这是一种解决方法:仅在字符串的其余部分(在外循环中)不存在_it时,才计算(打印)字母。这样,您可以确保重复的内容将被忽略。

这是一个使用两个嵌套循环的示例,类似于您的代码:

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

一些评论:

  • 不建议使用Mid()。而是使用str.SubString(),如果只需要一个字符,则可以使用str(index)

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


原始答案:

使用Dictionary跟踪字母的数量,然后显示字母的数量:

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

答案 1 :(得分:0)

您有两个循环:选择字母的外部循环;和一个内部循环来测试字母在文本框字符串中出现的次数。

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

相反,您应该从整个符号集中选择字母-通常为‘ ‘‘~’。但是您将不得不为根本没有出现的符号添加额外的代码:如果计数为零,则不打印任何内容。

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