Java递归解压缩程序没有完成

时间:2015-12-12 06:33:23

标签: java recursion standard-library compression

我正在尝试创建一个程序来解压缩使用RLE压缩的字符串。但是,解压缩程序必须以递归方式编写,不需要循环,也不必在方法之外声明变量。以下是我迄今为止最接近的尝试,我能够获得第一个"片段#34;解压缩的压缩串(例如:4w,q,g,J,6y等)。在那之后它只是不会打印出任何其他东西,而我却无法理解为什么。非常感谢

public class StringRec{

public static void main(String[] a){
System.out.println("string: ");
String decomp = IO.readString();
System.out.println(decompress(decomp));
}

public static String decompress(String compressedText){
    int count = compressedText.length();
    String index = "";

 if(count == 0){
        return "";  
}

我想做一些不再调用解压缩方法的条件, 因为它们的条件是它们是字符串中的最后一块,所以在它们的部分被解压后完成它。当然,在调用解压缩调用的其他条件之后,调用将在运行时结束时发生。不确定为什么它不起作用。

else{
 if(Character.isDigit(compressedText.charAt(0))){

        String s = String.format("%0" + compressedText.charAt(0) + "d", 0).replace('0', compressedText.charAt(1));
        index = s;
        compressedText = compressedText.substring(2);
        decompress(compressedText);

    }
    else if(Character.isDigit(compressedText.charAt(0)) && compressedText.length()==2){ 

        String s2 = String.format("%0" + compressedText.charAt(0) + "d", 0).replace('0', compressedText.charAt(1));
        index = s2;

    }else if(Character.isLetter(compressedText.charAt(0))){     

        String s3 = Character.toString(compressedText.charAt(0));
        index = s3;
        compressedText = compressedText.substring(1);
        decompress(compressedText);

    }
    else if(Character.isLetter(compressedText.charAt(0)) && compressedText.length()==1){

        String s4 = Character.toString(compressedText.charAt(0));
        index = s4;

    }
return index;
}
}

我目前的猜测是,它与调用解压缩方法的方​​式有关,或者在调用解压缩方法之后我如何安排输出的问题,但是我不会这样做能够解释字符串的第一部分如何一致地工作。

2 个答案:

答案 0 :(得分:0)

试试这个。

public static String decompress(String compressedText) {
    int count = compressedText.length();
    if (count == 0) {
        return "";
    } else if (Character.isDigit(compressedText.charAt(0))) {
        String s = String.format("%0" + compressedText.charAt(0) + "d", 0)
                .replace('0', compressedText.charAt(1));
        return s + decompress(compressedText.substring(2));
    } else if (Character.isLetter(compressedText.charAt(0))) {
        String s3 = Character.toString(compressedText.charAt(0));
        return s3 + decompress(compressedText.substring(1));
    } else
        return compressedText;
}

答案 1 :(得分:0)

这是行不通的,因为你忘记了连接'使用当前索引变量值进行递归解压缩调用的结果。正是因为这样,你才得以堕落。递归调用的结果,只有第一次调用的结果。

如果您在代码中使用decompress(compressedText)修改index = index + decompress(compressedText)行,您的结果将是您所期望的。

(顺便说一句,你应该将主题重命名为' Java递归解压缩程序没有得到预期的结果'因为从标题我会期望产生一些代码无限递归调用:))