如何避免在第二次迭代中出现异常?

时间:2019-02-07 17:24:29

标签: java algorithm debugging

我正在尝试显示字母在字符串中出现的次数,并将其输出到新的字符串(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 :(得分:1)

这就是我要更改代码的方式。

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;
  }

答案 1 :(得分:1)

其他答案都有很好的解决方案,但我想我只想补充一下我提出的内容:

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;
    }
}

答案 2 :(得分:1)

尝试一下

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;
}


}

答案 3 :(得分:0)

修改for循环以在i < str.length() - 1时终止-这是因为您正在将i处的字符与i + 1处的字符进行比较,这使循环超出了范围。

答案 4 :(得分:0)

您的情况应该是这样的:

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

因为当您位于字符串的最后一个索引处时,您还要将第i个索引与第i + 1个索引进行比较。

但是在更正此错误之后,此代码仍无法提供预期的输出。

答案 5 :(得分:0)

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
}