Кодировка длины пробега - VB.NET - PullRequest
0 голосов
/ 11 июня 2018

Мне было просто интересно, могут ли люди помочь мне понять некоторые аспекты кода.Я заранее благодарю вас, так как это поможет мне лучше понять, как работает RLE и как создаются циклы.

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
    For Count = 0 To Len(Text) - 1

Эту строку и следующую мне трудно понять.Подсчитано ли значение значения длины текста, но - 1?

        If Text(Count) = LastChar Then
            CountOfLastChar += 1
        Else
            If LastChar <> "" Then
                Console.Write(LastChar & " " & CountOfLastChar & " ")

Я предполагаю, что это должно гарантировать, что, если ничего не введено, оно сможет обработать его.

            End If
            LastChar = Text(Count)
            CountOfLastChar = 1

Зачем CountOfLastChar нужно = 1?

        End If
    Next
    Console.Write(LastChar & " " & CountOfLastChar & " ")
    Console.ReadLine()
End Sub

Ответы [ 2 ]

0 голосов
/ 13 июня 2018

Правильное выравнивание кода действительно помогает вам в этом.

Я добавил комментарии в коде, чтобы объяснить каждую деталь, с вашими конкретными точками, отмеченными ниже как # 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

В частности, в трех упомянутых вами точках:

  1. Цикл в VB переходит от одного значения к другому, , включая конечное значение.Однако индексы символов внутри строки доходят только до значения на единицу меньше , чем длина строки (например, строка длиной «2» имеет только индексы «0» и «1»)таким образом, из этой длины вычитается единица.

    На следующей строке Text(Count) на самом деле является операцией с массивом ;Text обрабатывается как массив символов, и из него берется символ с индексом Count и сравнивается с LastChar, подсчитываемым в данный момент.

  2. Это точка, когда циклобнаруживает, что текущий символ в строке отличается от того, который был подсчитан до сих пор.Здесь он распечатывает этот предыдущий символ и количество раз, когда он был найден.
  3. Опять же, этот код выполняется при обнаружении нового символа.Новый персонаж хранится в 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 редко используется для текста, поскольку язык обычно никогда не содержит более двух последовательных идентичных символов.

0 голосов
/ 11 июня 2018

Я ничего не знаю о RLE, но могу немного рассказать о цикле.В vb.net цикл For ... Next будет начинаться с Count = 0 и увеличиваться на единицу на каждой итерации до и включительно (Text.Lenght -1). Вы можете изменить величину увеличения или уменьшения, добавив Шаг 2 (или-5 или что угодно) Это делается так, потому что первый символ в строке находится в нулевой позиции.Len(Text) осталось от VB6 при использовании нового кода Text.Length Примечание: с Nothing vs String.Empty

For Count = 0 To Len(Text) - 1
'When you add an indexer to a string you get the character at that index
        If Text(Count) = LastChar Then
он работает иначе
...