Как избежать исключения во второй итерации? - PullRequest
0 голосов
/ 07 февраля 2019

Я пытаюсь отобразить количество раз, когда буква появляется в строке и выводит ее в новой строке (compressedString).

Например: aabcccccaaa должно отображать a2b1c5a3.

Пока что у меня есть a2 для отображения только потому, что я включил оператор break.Если бы я убрал это, то получил бы StringIndexOutOfBoundsException.

Мой вопрос: как бы я продолжил проходить всю строку, чтобы получить оставшуюся часть вышеупомянутого вывода без получения StringIndexOutOfBoundsException?

Я запустил его через отладчик, но мне все еще не ясно.

public class Problem {

public static void main(String []args) {
    String str = "aabcccccaaa";
    System.out.println(compressBad(str));
}

public static String compressBad(String str) {
    int countConsecutive = 0;
    String compressedString = "";

    for(int i = 0; i < str.length(); i++) {
        countConsecutive++;
        if(str.charAt(i) != str.charAt(i + 1)) {
            compressedString += "" + str.charAt(i) + countConsecutive;
            break;
        }
    }
    return compressedString;
  }
}

Ответы [ 6 ]

0 голосов
/ 07 февраля 2019

Mukit09 уже упомянул причину вашего StringIndexOutOfBoundsException.

Я предлагаю вам более эффективную реализацию, использующую String Builder для объединения строк:

private static String comppressedString(String str) {       
    if(str == null || str.equals("")) {
        return str;
    }
    if(str.length() == 1) {
        return str + "1";
    }

    StringBuilder sb = new StringBuilder();
    sb.append(str.charAt(0)); // Add first letter
    int j = 1; // Counter for current sequence length.

    for (int i = 0; i < str.length() - 1; i++) {
        if(str.charAt(i) != str.charAt(i + 1)) { // end of characters sequence.
            sb.append(j); // Add length of previous sequence.
            if(j > 1) {
                j = 1; // Minimum sequence length is 1
            }
            sb.append(str.charAt(i+1)); // Add character of next sequence.
        } else {
            j++; // increase counter, in order to get the length of the current sequence.
        }
    }
    sb.append(j); // Add length of last sequence.

    return sb.toString();
}

public static void main(String[] args) {
    System.out.println(comppressedString("")); // empty string
    System.out.println(comppressedString("a")); // a1
    System.out.println(comppressedString("ab")); // a1b1
    System.out.println(comppressedString("abba")); // a1b2a1
    System.out.println(comppressedString("aabcccccaaa")); // a2b1c5a3
}
0 голосов
/ 07 февраля 2019

Попробуйте это

public class Problem {

   public static void main(String []args) {
     String str = "aaabc";
     System.out.println(compressBad(str));
 }

 public static String compressBad(String str) {
    int countConsecutive = 0;
    String compressedString = "";

 for(int i = 0; i < str.length(); i++) {
   countConsecutive++;
   //avoid index out of bounds error
   if(str.length() == (i + 1)){
       compressedString += ""+ str.charAt(i) + countConsecutive;
       countConsecutive = 0;
       break;
   }
   else if(str.charAt(i) != str.charAt(i + 1)){
       compressedString += ""+ str.charAt(i) + countConsecutive;
       countConsecutive = 0;
   }


}
return compressedString;
}


}
0 голосов
/ 07 февраля 2019

У других ответов есть хорошие решения, но я подумал, что просто добавлю то, что придумал:

public class Problem {
    public static void main(String []args) {
        String str = "aabcccccaaa";
        System.out.println(compressBad(str));
    }

    public static String compressBad(String str) {
        if (str.length() == 1) return str + "1"; // Handles single character strings
        int countConsecutive = 0;
        String compressedString = "";
        for (int i = 0; i < str.length(); i++) {
            if (i > 0) {
                countConsecutive++;
                if (str.charAt(i) != str.charAt(i-1)) {
                    compressedString += "" + str.charAt(i-1) + countConsecutive;
                    countConsecutive = 0;
                }
                if (i == str.length()-1) {
                    countConsecutive++; // Needs to be incremented for the last character
                    compressedString += "" + str.charAt(i) + countConsecutive;
                }
            }
        }
        return compressedString;
    }
}
0 голосов
/ 07 февраля 2019

Так я бы изменил код.

public static String compressBad(String str) {
    String compressedString = "";
    if (str != null && str.length() > 0) {
        int countConsecutive = 1;
        char prevChar = str.charAt(0);

        for (int i = 1; i < str.length(); i++) {
            if (str.charAt(i) != prevChar) {
                // End of a run.  Update compressedString and reset counters
                compressedString += String.valueOf(prevChar) + countConsecutive;
                prevChar = str.charAt(i);
                countConsecutive = 1;
                continue;
            }
            countConsecutive++;
        }
        compressedString += String.valueOf(prevChar) + countConsecutive;
    }
    return compressedString;
  }
0 голосов
/ 07 февраля 2019

Ваше состояние должно быть таким:

if(i+1 < str.length() && str.charAt(i) != str.charAt(i + 1))

, потому что, когда вы находитесь на последнем индексе вашей строки, вы также сравниваете i-й индекс с i + 1-м индексом.

Но после исправления этого код все равно не даст ожидаемого результата.

0 голосов
/ 07 февраля 2019

изменяет ваш цикл for, чтобы завершить его, когда i < str.length() - 1 - это потому, что вы сравниваете символ в i с символом в i + 1, что делает ваш цикл выходящим за пределы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...