2014-11-18 4 views
-1

Не знаете, почему мой код не работает. Если я нахожу qwwwwwwwwweeeeerrtyyyyyqqqqwEErTTT, я получаю qw9w5e2ry5y4qE2ET3T, когда я должен получать q9w5e2rt5y4qw2Er3T.Сжатие строки в Java

Кодировка длины пробега (RLE) - это простой «алгоритм сжатия» (алгоритм, который берет блок данных и уменьшает его размер, создавая блок, содержащий ту же информацию в меньшем пространстве). Он работает, заменяя повторяющиеся последовательности идентичных элементов данных короткими «токенами», которые представляют целые последовательности. Применение RLE к строке включает в себя поиск последовательностей в строке, где повторяется один и тот же символ. Каждая такая последовательность должна быть заменена «маркером», состоящим из:

количество символов в последовательности повторяющийся символ Если символ не повторяется, его следует оставить в покое.

В качестве примера рассмотрим следующую строку:

qwwwwwwwwweeeeerrtyyyyyqqqqwEErTTT 

После применения алгоритма RLE, эта строка преобразуется в:

q9w5e2rt5y4qw2Er3T 

В сжатой строки, "9w" представляет собой последовательность из 9 последовательных строчные буквы "w" символов. "5e" представляет собой 5 последовательных строчных символов "e" и т. Д.

Напишите программу, которая берет строку в качестве входных данных, сжимает ее с использованием RLE и выводит сжатую строку. Вопросы дела - прописные и строчные буквы должны рассматриваться как отдельные. Вы можете предположить, что в строке ввода нет цифр. На вход нет других ограничений - в нем могут быть пробелы или знаки препинания. Нет необходимости рассматривать небуквенные символы иначе, чем буквы.

public class Compress{ 
    public static void main(String[] args){ 
     System.out.println("Enter a string: "); 
     String str = IO.readString(); 
     int count = 0; 
     String result = ""; 

     for (int i=1; i<=str.length(); i++) { 
      char a = str.charAt(i-1); 
      count = 1; 

      if (i-2 >= 0) { 
      while (i<=str.length() && str.charAt(i-1) == str.charAt(i-2)) { 
       count++; 
       i++; 
      } 
      } 
      if (count==1) { 
       result = result.concat(Character.toString(a)); 
      } 
      else { 
       result = result.concat(Integer.toString(count).concat(Character.toString(a))); 
      } 
     } 
     IO.outputStringAnswer(result); 
    } 
} 
+0

Вы не должны быть, начиная с позиции '0' вместо '1'? Java с нулевым индексом – MadProgrammer

+0

@MadProgrammer, no. Я получаю следующее сообщение об ошибке: Исключение в потоке «main» java.lang.StringIndexOutOfBoundsException: Индекс строки за пределами диапазона: -1 – user3412722

+0

Существует проблема с состоянием в вашем 'while'. Я думаю, вы должны попробовать отладить его самостоятельно, но вместо того, чтобы дать вам ответ. Если вы не используете IDE с отладчиком, попробуйте добавить некоторые 'System.out.println', чтобы увидеть, какие символы сравниваются и когда. – ajb

ответ

0

Я хотел бы начать с нуля, и с нетерпением ждем:

public static void main(String[] args){ 
    System.out.println("Enter a string: "); 
    String str = IO.readString(); 
    int count = 0; 
    String result = ""; 

    for (int i=0; i < str.length(); i++) { 
     char a = str.charAt(i); 
     count = 1; 

     while (i + 1 < str.length() && str.charAt(i) == str.charAt(i+1)) { 
      count++; 
      i++; 
     } 

     if (count == 1) { 
      result = result.concat(Character.toString(a)); 
     } else { 
      result = result.concat(Integer.toString(count).concat(Character.toString(a))); 
     } 
    } 

    IO.outputStringAnswer(result); 
} 

Некоторые выходы:

qwwwwwwwwweeeeerrtyyyyyqqqqwEErTTT => q9w5e2rt5y4qw2Er3T 
qqwwwwwwwweeeeerrtyyyyyqqqqwEErTTT => 2q8w5e2rt5y4qw2Er3T 
qqwwwwwwwweeeeerrtyyyyyqqqqwEErTXZ => 2q8w5e2rt5y4qw2ErTXZ 
aaa => 3a 
abc => abc 
a => a 
Смежные вопросы