Java 索引越界异常字符串8

Java 索引越界异常字符串8,java,string,indexoutofboundsexception,Java,String,Indexoutofboundsexception,我正在尝试建立一种压缩算法,当字符串中的字符连续出现时,将数字放在字符之前。例句:为了绳子 “Balloonnns”它将被压缩为“ba2l2o5n”,但我收到一个索引越界错误: for(int i = 0; i < (length-1); i++ ){ if (original.charAt(i) == original.charAt(i + 1)){ count = count + 1; original = original.substring

我正在尝试建立一种压缩算法,当字符串中的字符连续出现时,将数字放在字符之前。例句:为了绳子 “Balloonnns”它将被压缩为“ba2l2o5n”,但我收到一个索引越界错误:

for(int i = 0; i < (length-1); i++ ){
    if (original.charAt(i) == original.charAt(i + 1)){
        count = count + 1; 
        original = original.substring(i, i+1);
        System.out.println(original);
        System.out.println(count); 
        if(count > 0){
            altered = count + original.substring(i);
            System.out.println(altered);
        }
    }else{
        count = 0;
for(int i=0;i<(length-1);i++){
如果(原始字符(i)=原始字符(i+1)){
计数=计数+1;
原始=原始子字符串(i,i+1);
系统输出打印号(原件);
系统输出打印项次(计数);
如果(计数>0){
更改=计数+原始子字符串(i);
系统输出打印项次(修改);
}
}否则{
计数=0;

第一次执行循环时,将名为“original”的字符串更新为实际“original”字符串的第一个字符。 例如,如果字符串original=“aaa”-在循环执行0之后,original的值变为“a”

有关解决方案,您可以参考以下内容:

第一次执行循环时,将名为“original”的字符串更新为实际“original”字符串的第一个字符。 例如,如果字符串original=“aaa”-在循环执行0之后,original的值变为“a”

有关解决方案,您可以参考以下内容:

正如@Jon Skeet所指出的,在循环过程中,你不应该改变你原来的想法。 您可以尝试这种方式(对代码进行注释以便于理解)

测试:
公共类测试
{
公共静态void main(字符串[]args)
{
字符串original=“balloonnns”;
int length=original.length();
整数计数=1;
字符串=”;
//在所有字符串上循环
对于(int i=0;i<(长度-1);i++){
//虽然他们是一样的
while(original.charAt(i)=original.charAt(i+1)){
//数一数并继续使用原始字符串
计数++;
i++;
//重复最后一个字符时避免使用边框大小写,即:baaaaaaa
如果(i==长度-1)
{
打破
}
}
//如果它们被重复
如果(计数>1)
{
//添加更改+计数+重复字符,即a3e5t
更改=更改+计数+原始字符(i);
}
否则{
//只需添加普通字符而不进行计数
更改+=原始字符(i);
}
//如果不重复,请添加最后一个字符
如果((i==长度-2)和(&(计数>1))
{
更改+=原始字符(i+1);
}
//重置计数
计数=1;
}
System.out.println(已更改);
}
}
输出: ba2l2o5ns


正如@Jon Skeet所指出的,在循环中,你不应该改变你原来的想法。 您可以尝试这种方式(对代码进行注释以便于理解)

测试:
公共类测试
{
公共静态void main(字符串[]args)
{
字符串original=“balloonnns”;
int length=original.length();
整数计数=1;
字符串=”;
//在所有字符串上循环
对于(int i=0;i<(长度-1);i++){
//虽然他们是一样的
while(original.charAt(i)=original.charAt(i+1)){
//数一数并继续使用原始字符串
计数++;
i++;
//重复最后一个字符时避免使用边框大小写,即:baaaaaaa
如果(i==长度-1)
{
打破
}
}
//如果它们被重复
如果(计数>1)
{
//添加更改+计数+重复字符,即a3e5t
更改=更改+计数+原始字符(i);
}
否则{
//只需添加普通字符而不进行计数
更改+=原始字符(i);
}
//如果不重复,请添加最后一个字符
如果((i==长度-2)和(&(计数>1))
{
更改+=原始字符(i+1);
}
//重置计数
计数=1;
}
System.out.println(已更改);
}
}
输出: ba2l2o5ns


为什么有
original=original.substring(i,i+1);
?这似乎不是您真正想要的。提示:当您不更改算法中的输入数据时,更容易对算法进行推理。为什么有
original=original.substring(i,i+1)
?这似乎不是您真正想要的。提示:当您不更改算法中的输入数据时,更容易对算法进行推理。
public class Test
{

    public static void main ( String [ ] args )
    {
        String original = "balloonnnnns";
        int length = original.length ( );
        int count = 1;
        String altered = "";
        //Loop over all string
        for(int i = 0; i < (length-1); i++ ){
            //while they are the same
            while (original.charAt(i) == original.charAt(i + 1)){
                //count and keep going on the original string
                count++;
                i++;
                //avoid border case when last character is repeated, i.e : baaaaaaaa
                if ( i == length -1)
                {
                    break;
                }
            }
            //if they are repetead
            if(count > 1)
            {
                //add altered + count + charRepeated, i.e. a3e5t
               altered = altered +count + original.charAt(i);

            }
            else{
                //just add the normal character without count
                altered += original.charAt(i);
            }
            //add last character if not repeated
            if ( (i == length - 2) && (count > 1))
            {
                altered += original.charAt ( i+1 );
            }

            //reset counting 
            count = 1;

        }
        System.out.println ( altered );
    }
}