Search code examples
javastringloopsrun-length-encoding

Run-length encoding program have number come before letter


I'm making a program for run-length encoding which is used to shorten words. i.e. aaabbc becomes 3a2bc

My program works so far but instead of outputting 3a2bc it does a3b2c. So how can I make my current program switch?

Code:

public class Compress {
       public static void main(String[] args) {
          String word = "aaabbc";
          System.out.println(compress(word));
       }


       public static String compress (String original){
              String compressed = "";

              char ch = original.charAt(0);
              int counter = 1;
              for (int i = 1; i < original.length(); i++) { 
                 if (ch == original.charAt(i)) {
                    counter = counter + 1;
                 } 
                 else {
                     compressed = compressed + ch;
                    if(counter != 1){
                       compressed = compressed + counter;
                    }
                    ch = original.charAt(i);
                    counter = 1;
                 }
              }
              compressed = compressed + ch;
              if(counter != 1){
                 compressed = compressed + counter;
              }
              return compressed;
       }
}

Solution

  • where you have:

                 else {
                     compressed = compressed + ch;
                    if(counter != 1){
                       compressed = compressed + counter;
                    }
                    ch = original.charAt(i);
                    counter = 1;
                 }
    

    you should switch the first two statement blocks, like

                 else {
                    if(counter != 1){
                       compressed = compressed + counter;
                    }
                     compressed = compressed + ch;
                    ch = original.charAt(i);
                    counter = 1;
                 }
    

    BTW, its much more efficient to use StringBuilder for this rather than String