Правильное выравнивание кода действительно помогает вам в этом.
Я добавил комментарии в коде, чтобы объяснить каждую деталь, с вашими конкретными точками, отмеченными ниже как # 1, # 2 и # 3.
Sub Main()
Dim Text As String
Dim LastChar As String
Dim CountOfLastChar As Integer
Console.Write("Enter the text to compress: ")
Text = Console.ReadLine()
Console.Write("The compressed text is: ")
LastChar = ""
CountOfLastChar = 0
' #1: Loop until the end of the string.
For Count = 0 To Len(Text) - 1
' increase count if the current character equals the character to check.
If Text(Count) = LastChar Then
CountOfLastChar += 1
Else
' only execute this step if it's not the start of the loop.
If LastChar <> "" Then
' #2: Display the found amount of the previous character.
Console.Write(LastChar & " " & CountOfLastChar & " ")
End If
' Set new character to find the amount of.
LastChar = Text(Count)
' #3: Set counter of the new encountered character to 1.
CountOfLastChar = 1
End If
Next
' Since loop ended without that final 'display found amount' step
' (since no new character was encountered after the last one, obviously)
' execute that final step and display the repeat of the last found char.
' This should actually also have the [If LastChar <> ""] check to work with empty strings.
Console.Write(LastChar & " " & CountOfLastChar & " ")
Console.ReadLine()
End Sub
В частности, в трех упомянутых вами точках:
Цикл в VB переходит от одного значения к другому, , включая конечное значение.Однако индексы символов внутри строки доходят только до значения на единицу меньше , чем длина строки (например, строка длиной «2» имеет только индексы «0» и «1»)таким образом, из этой длины вычитается единица.
На следующей строке Text(Count)
на самом деле является операцией с массивом ;Text
обрабатывается как массив символов, и из него берется символ с индексом Count
и сравнивается с LastChar
, подсчитываемым в данный момент.
- Это точка, когда циклобнаруживает, что текущий символ в строке отличается от того, который был подсчитан до сих пор.Здесь он распечатывает этот предыдущий символ и количество раз, когда он был найден.
- Опять же, этот код выполняется при обнаружении нового символа.Новый персонаж хранится в
LastChar
.Очевидно, что поскольку вы на самом деле работаете с персонажем, то у него уже есть цифра «1».Затем цикл определит, нужно ли добавить к этому количеству больше.
Просто установите точку останова в начале программы и выполните цикл в режиме отладки;вы увидите, как это работает.Вот простой пример:
Введите текст для сжатия: mooncell
Сжатый текст: m 1 o 2 n 1 c 1 e 1 l 2
Однако эта функция - всего лишь демонстрация концепции.Это на самом деле не сжимает данные;"m1o2n1c1e1l2" намного длиннее, чем "mooncell".RLE, как правило, не работает с данными без большого количества повторений (например, изображений со строками пикселей одного цвета), и существуют специальные механизмы, такие как флаги индикатора повтора или токены команды / длины, которые позволяют пропускать несжимаемые данные.
Здесь есть очень хорошая статья об этом:
http://www.shikadi.net/moddingwiki/RLE_Compression
Хотя обратите внимание, что это в основном с точки зрения сжатия data , а не текст сжатие.Как я уже указывал в моем примере выше, RLE редко используется для текста, поскольку язык обычно никогда не содержит более двух последовательных идентичных символов.