2015-12-12 2 views
0

Я пытаюсь создать программу для распаковки строки, сжатой с использованием RLE. Однако программа декомпрессии должна записываться рекурсивно, без циклов и без объявления переменных вне метода. Ниже моя самая близкая попытка до сих пор, я могу получить первый «кусок» сжатой строки (например: 4w, q, g, J, 6y и т. Д.). После этого он просто ничего не распечатает, и мне трудно понять, почему. во многом благодаряПрограмма рекурсивной декомпрессии Java не заканчивается

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; 
} 
} 

Моих текущих догадок в том, что у него есть что-то делать с тем, как называется метод распаковки, или его проблема с тем, как я организую вывод должна быть возвращена после того, как метод распаковки уже называется, но потом я Wouldn Невозможно объяснить, как первая часть строки работает последовательно.

ответ

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; 
} 
+0

благодарственных вы так много! Это работает, и я думаю, что я понимаю, почему, но: в операторах возврата важно, чтобы он вернул строку, а затем снова активировал распаковку, или может ли эта часть работать, если распаковка была первой, а затем плюс строка –

+0

Если вы напишите '' 'return dempress (...) + s;' '' и '' 'return decpress (...) + s3''', вы получите результат с обратным адресом. – saka1029

0

Он не работает, потому что вы забыли «конкатенировать» результат рекурсивных распаковки вызовов с текущим значением переменной индекса. Из-за этого вы «отбрасываете» результаты рекурсивных вызовов и получаете результат только первого вызова.

Если вы внесете в свой код строки decompress(compressedText) с кодом index = index + decompress(compressedText), ваши результаты будут такими, какие вы ожидаете.

(Кстати, вы должны переименовать тему на что-то вроде «программы Java рекурсивной декомпрессии не получает ожидаемый результата», потому что из названия я ожидал бы некоторый код, который производит бесконечные рекурсивные вызовы :))

Смежные вопросы