这个程序是关于java中的字符串压缩

时间:2018-06-04 18:08:17

标签: java string for-loop

我是编码的新手所以请指导我解决这个问题。我从用户设置输入字符串s并声明StringBuilder sb和整数类型变量consec

我在'if'条件下获得IndexOutOfBound例外:

for (int i=0;i<s.length();i++) {
    consec++;
    if(s.charAt(i)!=s.charAt(i+1) || i+1>=s.length()) {
        sb.append(s.charAt(i));
        sb.append(consec);
        consec=0;
    }
}

3 个答案:

答案 0 :(得分:3)

这是因为在你循环的最后一次迭代中,你正在访问不在数组中的元素(索引高于数组的大小),所以试试这个:

for(int i=0;i<s.length()-1;i++){    //<<See this
    //your logic
}

当String的长度为偶数时,您需要在for循环后明确地检查边缘大小写。例如,

for(int i=0;i<s.length()-1;i++){    //<<See this
    //your logic
}
if(s.length()%2==0){
    //your logic when length is even and loop has ignored last character.
}

答案 1 :(得分:1)

Java始终从左到右进行评估。所以这个:

s.charAt(i)!=s.charAt(i+1) || i+1>=s.length()

在检查s.charAt(i+1)之前评估i+1>=s.length()。当i+1 >= s.length()时,s.charAt(i+1)将失败,因为它超出了字符串的结尾。

反转操作数的顺序:

i+1>=s.length() || s.charAt(i)!=s.charAt(i+1)

因为||是一个短路运算符,所以如果s.charAt(i)!=s.charAt(i+1)为false,则仅评估i+1>=s.length(),因此在这种情况下它不会失败并带有异常。

答案 2 :(得分:0)

考虑一个字符串,

String s = "abcd";

你的循环将从0开始 - &gt; s.length() - 1,即从0 - > 3 所以当你在索引3时,i+1=4 所以,s.charAt(i + 1)将抛出超出范围的异常,因为4高于数组索引。因此,要么从i -> 0 to i < s.length()-1运行循环。或者将现有代码更改为以下内容:

for(int i=0;i<s.length();i++)
{
    consec++;
    if(i+1<s.length() && s.charAt(i)!=s.charAt(i+1))
    {
        sb.append(s.charAt(i));
        sb.append(consec);
        consec=0;
    }
}