VB.Net如何修改ToModern函数使字符统计结果按输入出现顺序输出
问题原因
你现有代码是固定先统计整个字符串中A的总数量、再统计B的总数量、最后统计C的总数量,拼接顺序永远固定为A计数+A + B计数+B + C计数+C,和字符在输入里的出现顺序完全无关,所以才会得到不符合预期的输出。
实现方案(游程编码,匹配你给出的测试用例逻辑)
你需要的是按连续相同字符的出现顺序统计数量,对应代码如下:
Public Function ToModern(_cond$) If String.IsNullOrEmpty(_cond) Then Return "" Dim result As New Text.StringBuilder() ' 初始化当前字符为第一个字符,计数为1 Dim currentChar As Char = _cond(0) Dim count As Integer = 1 For i = 1 To _cond.Length - 1 If _cond(i) = currentChar Then ' 和当前字符相同,计数+1 count += 1 Else ' 字符变化,拼接上一组的结果,重置当前字符和计数 result.Append($"{count}{currentChar}") currentChar = _cond(i) count = 1 End If Next ' 拼接最后一组的结果 result.Append($"{count}{currentChar}") Return result.ToString() End Function
测试验证
Public Function Test() Trace.WriteLine(ToModern("AAABBBCCC")) ' 输出 3A3B3C,符合预期 Trace.WriteLine(ToModern("CCCCBBBAAA")) ' 输出 4C3B3A,为你需要的顺序(你提到的3C为笔误,输入的C实际为4个) Trace.WriteLine(ToModern("BBAACCCC")) ' 输出 2B2A4C,和输入字符顺序匹配 End Function
若你需要的是按字符首次出现顺序统计全量总数(非连续分组)
比如输入ABAC时输出3A1B1C,可以用以下实现:
Public Function ToModern(_cond$) If String.IsNullOrEmpty(_cond) Then Return "" Dim charCount As New Dictionary(Of Char, Integer) Dim charOrder As New List(Of Char) For Each c In _cond If charCount.ContainsKey(c) Then charCount(c) += 1 Else charCount.Add(c, 1) charOrder.Add(c) End If Next Return String.Join("", charOrder.Select(Function(c) $"{charCount(c)}{c}")) End Function
内容的提问来源于stack exchange,提问作者DVELPR
相关产品推荐
相关产品推荐

