Search code examples
javaparseintcharat

Expanding a condensed string


I am trying take a string similar to this: 3A5o2n4t and expand it back to a string like this: AAAooooonntttt (the number in front of the letter is how many times the letter repeats) I was trying to use Integer.parseInt() to get the number in front of the letter, but it grabs all of the numbers. Is there a way to grab one number at a time? Also, does my code look okay after that issue is resolved? Or am I missing a bit still?

public String runLengthDecoding(String str3) {
          String convert = "";
          int number = 0;
          if (! str3.isEmpty()) {
             convert = str3.charAt(0) + "";
          }
          for (int i = 0; i <= str3.length() - 1; i++) { 
             if (Character.isDigit(str3.charAt(i))) { //true or false, the current character is a digit
                String temp = "" + str3.charAt(i); //if true, make that character a string
                number = Integer.parseInt(temp); /*now store that character as a number (but I only want the current
                                                   number, not all the numbers in the string*/
                System.out.println(number); /*Testing to see what number is, which is where I found it was 
                                               storing all the numbers */
                String temp2 = str3.charAt(i + 1) + ""; //Its supposed to start making a string that prints the character in front of it
                convert = temp2.repeat(number); //it will print the character however many times that number was stored as
             }

       }
       return convert;
       }

Also I have not yet learned how to use arrays, that is why I am not using an array.


Solution

  • Edited to:
    - accommodate strings that has length more then 1. Example: 10AA
    - accommodate input that starts with a string. Example: A5o

    To solve this you have to get all the simultaneous digits, example if you have "55s", you have to get "55", That is why your code is incorrect since if you parseInt whenever you see a digit then it will immediately parse into 5, but the actual number is 55, thus you should accumulate the simultaneous digits first and only parseInt when you encounter the first non digit.

    Refer to the code and comments for details:

    public class Main {
        public static void main(String[] args) {
            System.out.println("Input: 3A5o2n4t => Output : " + runLengthDecoding("3A5o2n4t"));
            System.out.println("Input: 3AA5o2n4t => Output : " + runLengthDecoding("3AA5o2n4t"));
            System.out.println("Input: 10A5o2n4t => Output : " + runLengthDecoding("10A5o2n4t"));
            System.out.println("Input: 10AA5o2n4t => Output : " + runLengthDecoding("10AA5o2n4t"));
            System.out.println("Input: A5o => Output : " + runLengthDecoding("A5o"));
            System.out.println("Input: AB5o => Output : " + runLengthDecoding("AB5o"));
        }
    
        public static String runLengthDecoding(String str3) {
            String convert = "";
            int number = 0;
            String numberString = "";
            String toBeRepeatedString = "";
            boolean flag = false;
            for (int i = 0; i <= str3.length() - 1; i++) {
                char currentChar = str3.charAt(i);
                if (Character.isDigit(currentChar)) { // true or false, the current character is a digit
                    numberString = numberString + currentChar; // store the possible integer
                } else {
                    if (i + 1 < str3.length()) {
                        char nextChar = str3.charAt(i + 1); // check if the next char is a digit
                        if (!Character.isDigit(nextChar)) { // if not a digit then append toBeRepeatedString
    
                            if (i == 0 || i + 1 >= str3.length()) {
                                flag = true;
                            } else {
                                toBeRepeatedString += nextChar;
                                flag = false;
                            }
                        } else {
                            flag = true;
                        }
                    }
    
                    if (flag) {
                        toBeRepeatedString += currentChar;
    
                        // This will accomodate inputs "A3B";
                        if (!numberString.isEmpty()) {
                            number = Integer.parseInt(numberString); // parse the number of repeats
                        } else {
                            number = 1;
                        }
    
                        numberString = ""; // reset number
    
                        String temp2 = "";
    
                        // Repeat the currentChar
                        for (int j = 0; j < number; j++) {
                            temp2 += toBeRepeatedString;
                        }
    
                        convert = convert + temp2; // store it to the result
                        toBeRepeatedString = ""; // reset toBeRepeatedString
                    }
    
                }
    
            }
            return convert;
        }
    
    }
    

    Result:

    Input: 3A5o2n4t => Output : AAAooooonntttt
    Input: 3AA5o2n4t => Output : AAAAAAooooonntttt
    Input: 10A5o2n4t => Output : AAAAAAAAAAooooonntttt
    Input: 10AA5o2n4t => Output : AAAAAAAAAAAAAAAAAAAAooooonntttt
    Input: A5o => Output : Aooooo
    Input: AB5o => Output : ABooooo