我想把ab2cd3这样的字符串解压缩到ababcdababcdabcd



线程"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: ab2cd3Output: 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

最新更新