线程"main"java.lang.StringIndexOutOfBoundsException异常:字符串索引超出范围:5位于java.lang.String.substring(未知源(在start.compress.main(compress.java:16(
I;我得到这个错误我的代码:
package start;
import java.util.*;
public class compress {
public static void main(String args[]) {
int i, j;
Scanner v = new Scanner(System.in);
String s = v.next();
String sum = "";
for(i = 0;i < s.length(); i++) {
int k = s.charAt(i);
if(k >= 48 && k <= 57) {
for(j = 1;j < k; j++)
sum = sum + s.substring(0, i);
}
String c = k - 48 + "";
s = s.replaceFirst(c, sum);
}
System.out.println(s);
v.close();
}
}
您正在进行
for(j=1;j<k;i++)
相当于
while(j<k){
i++;
//some code which does not increment j and goes in to infinite loop
}
这就是为什么你在遇到异常
sum=sum+s.substring(0,i); // your i is increasing infinitely
应该是
for(j=1;j<k;j++)
UPDATE我刚刚意识到您的代码根本不起作用。
因为您的以下代码:
int k=s.charAt(i);
if(k>=48 && k<=57)
{
for(j=1;j<k;j++)
sum=sum+s.substring(0,i);
}
String c=k-48+"";
s=s.replaceFirst(c,sum);
}
当您读取a
时,您的k
将为97,并且您将循环97次。将循环更改为
for(j=49;j<k;j++)
sum=sum+s.substring(0,i);
它会很好用的。
您需要将for(j=1; j<k; i++)
中的increment
更改为for(j=49; j<k;j++)
。然而,这本身不会产生预期的结果。您需要在每个外部迭代中清除sum
变量。下面的代码将给出预期的结果
public static void main(String[] args) {
int i,j;
Scanner v=new Scanner(System.in);
String s=v.next();
for(i=0;i<s.length();i++)
{
String sum = "";
int k=s.charAt(i);
if(k>=48 && k<=57)
{
for(j=49;j<k;j++)
sum=sum+s.substring(0,i);
}
String c=k-48+"";
s=s.replaceFirst(c,sum);
}
System.out.println(s);
v.close();
}
Input: ab2cd3
Output: ababcdababcdababcd
您正在使用进行检查
for(j=1;j<k;i++)
sum=sum+s.substring(0,i);
它将从1到ASCII值超过48的字符运行。但很明显,输入字符串没有接近OutOfBonds范围的索引。如果您更改,也会出现异常
for(j=1;j<k;i++)
sum=sum+s.substring(0,i);
至
for(j=1;j<k;j++)
sum=sum+s.substring(0,j);
正如另一个答案中所述,但例外是因为您的j
一直运行到当前字符的ASCII。
我从你的问题中了解到,如果String
的最后一个字符是一个数字,它表示剩余字符串将重复多少次。在每组字符之后,"can"是一个数字,指示该组字符重复的次数。
例如,
- "ab2"===>"abab">
- "ab2c2"===>"ababcababc">
- "ab2c22"===>"ababccababcc">
- "ab2cd3"===>"ababcdedit">
话虽如此,从字符串中提取最后一个字符,并检查它是否是一个数字,该数字将控制整个解压缩的String
重复的次数,并从字符串中删除最后一个字符串。
然后使用regex
检查字符串的剩余部分,以查找"[a-zA-Z]+\d?"
的模式(一个或多个字母,可能后跟一个数字(。如果模式末尾有一个数字,它控制将字母模式解压缩到结果中的次数。
代码示例:
public static void main(String[] args) throws Exception {
List<String> inputs = new ArrayList() {
{
add("ab2");
add("ab2c2");
add("ab2c22");
add("ab2cd3");
}
};
for (String input : inputs) {
char lastCharacter = input.charAt(input.length() - 1);
int outerLoop = 1;
// If the last character is a digit set it to the outer loop and
// remove it from the string
if ('0' <= lastCharacter && lastCharacter <= '9') {
outerLoop = lastCharacter - 48;
// Remove the last digit character
input = input.substring(0, input.length() - 1);
}
// Build the decompressed string
StringBuilder decompressed = new StringBuilder();
for (int i = 0; i < outerLoop; i++) {
// Find patterns, if any that have letters followed by a number
Matcher matcher = Pattern.compile("[a-zA-Z]+\d?").matcher(input);
while (matcher.find()) {
String match = matcher.group();
// Check if the last character of the pattern is a number
// to control how many times to repeat this pattern in the
// decompressed string
lastCharacter = match.charAt(match.length() - 1);
int innerLoop = 1;
if ('0' <= lastCharacter && lastCharacter <= '9') {
innerLoop = lastCharacter - 48;
// Remove the last digit character
match = match.substring(0, match.length() - 1);
}
// Decompress the pattern
for (int j = 0; j < innerLoop; j++) {
decompressed.append(match);
}
}
}
// Display decompressed results
System.out.println(decompressed);
}
}
结果:
abab
ababcababc
ababccababcc
ababcdababcdababcd