Java 索引越界异常字符串8
我正在尝试建立一种压缩算法,当字符串中的字符连续出现时,将数字放在字符之前。例句:为了绳子 “Balloonnns”它将被压缩为“ba2l2o5n”,但我收到一个索引越界错误: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
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 );
}
}