Java 递归解压缩使用RLE压缩的字符串

Java 递归解压缩使用RLE压缩的字符串,java,recursion,Java,Recursion,我正在尝试编写一个方法,对使用RLE格式递归压缩的字符串进行解压缩。所以,我想要一个将5a2*3h32转换为AAAA**HH222的方法 输入:5a2*3h32 输出:aaaaa**hh222->这是正确的 输入:i24应为:i44 输出:线程主java.lang.NumberFormatException中的异常输入字符串的异常:i 所以基本上它不喜欢字符前面没有数字。但是,如果输入在字符串末尾有一个单独的字符,则该方法可以正常工作 我似乎无法理解这一点。任何输入都会非常有用 public s

我正在尝试编写一个方法,对使用RLE格式递归压缩的字符串进行解压缩。所以,我想要一个将5a2*3h32转换为AAAA**HH222的方法

输入:5a2*3h32

输出:aaaaa**hh222->这是正确的

输入:i24应为:i44

输出:线程主java.lang.NumberFormatException中的异常输入字符串的异常:i

所以基本上它不喜欢字符前面没有数字。但是,如果输入在字符串末尾有一个单独的字符,则该方法可以正常工作

我似乎无法理解这一点。任何输入都会非常有用

public static String decompress(String compressedText){
    char c = ' ';
    String temp;

    if(compressedText.length() != 1){
        c = compressedText.charAt(1);
    }if(compressedText.length() == 1){
        return compressedText;       
    }else if(compressedText.charAt(0) == '0' && compressedText.length() != 2){
        return decompress(compressedText.substring(2));
    }else if(compressedText.charAt(0) == '0' && compressedText.length() == 2){
        compressedText = "\0";
        return compressedText;
    }else if(Character.isLetterOrDigit(c) == true || Character.isLetterOrDigit(c) == false){
        int i = Integer.parseInt(compressedText.substring(0,1));
        i = i-1;
        temp = Integer.toString(i);
        return c + decompress(temp.concat(compressedText.substring(1)));
    }if(Character.isLetter(c) == false){
        c = compressedText.charAt(2);
        int i = Integer.parseInt(compressedText.substring(0,2));
        i = i-1;
        temp = Integer.toString(i);
        return c + decompress(temp.concat(compressedText.substring(2)));
    }
    return compressedText;
}

正如我所评论的,问题出在你的身体状况上,我稍微改变了一下,现在它开始工作了:

public static String decompress(String compressedText){
    char c = ' ';
    String temp;

    if(compressedText.length() != 1){
        c = compressedText.charAt(1);
    }if(compressedText.length() == 1){
        return compressedText;       
    }else if(compressedText.charAt(0) == '0' && compressedText.length() != 2){
        return decompress(compressedText.substring(2));
    }else if(compressedText.charAt(0) == '0' && compressedText.length() == 2){
        compressedText = "\0";
        return compressedText;
    }else if(Character.isDigit(compressedText.charAt(0)) == true){
        int i = Integer.parseInt(compressedText.substring(0,1));
        i = i-1;
        temp = Integer.toString(i);
        return c + decompress(temp.concat(compressedText.substring(1)));
    }
    return compressedText.charAt(0)+decompress(compressedText.substring(1));
}

签出在线版本。

我建议您编写单元测试,并找到最简单的不起作用的示例,然后在调试器中逐步查看代码以找出原因。这一行是什么?否则ifCharacter.isLetterOrDigitc==true | | Character.isLetterOrDigitc==false