我有一个任务要编写一个程序,该程序从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
答案 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)
您有两个循环:选择字母的外部循环;和一个内部循环来测试字母在文本框字符串中出现的次数。
您的问题是外循环也在从字符串本身中选择其字母。这样,字符串中任何重复的字母都意味着重复的输出。
相反,您应该从整个符号集中选择字母-通常为‘ ‘
至‘~’
。但是您将不得不为根本没有出现的符号添加额外的代码:如果计数为零,则不打印任何内容。
请注意,这不是一种非常有效的方法-您多次扫描文本框字符串-但它肯定足够快。