2013-11-28 44 views
1

對於我需要編寫一個解壓縮字符串的方法的代碼。例如,如果用戶輸入「2d5t」,該方法將返回「ddttttt」。我的代碼現在可以用於該輸入,但是如果輸入使用一個沒有數字的字符,那麼該程序不應該在它應該運行時運行。例如,如果輸入只是「d」,那麼程序將不會返回「d」。代碼也必須是遞歸的。 這裏是我的代碼現在請幫助。基本java程序不能正常工作

public static String decompress(String compressedText) { 
    if (compressedText.equals("")) 
     return ""; 
    return decompress(compressedText, charInt(compressedText, 0), 0); 
} 

public static String decompress(String text, int count, int pos) { 
    if (pos == text.length() || (pos == text.length()-2 && count == 0)) 
     return ""; 
    else if (count == 0) 
     return decompress(text, charInt(text, pos+2), pos+2); 
    return text.charAt(pos+1) + decompress(text, count-1, pos); 
} 

public static int charInt(String str, int idex) { 
    return str.charAt(idex) - '0'; 
} 
+2

你聽說過的正則表達式? – broncoAbierto

+0

你使用轉義字符嗎?有人可能想壓縮「1112223333344」。 –

回答

0

您需要驗證您的用戶輸入。首先決定哪些字符串值可用於您的方法,然後編寫驗證方法。然後在你的解壓縮方法中調用該方法。 在Java中查看string manipulation函數和regular expressions。然後嘗試重寫你的代碼。

0

正如別人所說,這可以用正則表達式來解決。一個例子的解決方案是:

public static String decompress(String compressed) { 
    Matcher matcher = Pattern.compile("(\\d+)([^\\d])").matcher(compressed); 
    StringBuffer decompressed = new StringBuffer(); 
    while (matcher.find()) { 
     Integer charNum = Integer.parseInt(matcher.group(1)); 
     StringBuilder decompressedChars = new StringBuilder(); 
     for (int i = 1; i <= charNum; i++) { 
     decompressedChars.append(matcher.group(2)); 
     } 
     matcher.appendReplacement(decompressed, decompressedChars.toString()); 
    } 
    matcher.appendTail(decompressed); 
    return decompressed.toString(); 
    } 

此代碼將不支持超過Integer.MAX_VALUE更大的數字,你可能想要把一些錯誤處理和驗證的,也有。

+0

抱歉忘了提起代碼必須遞歸 – user3044112

+0

這是作業還是什麼?因爲這是一個奇怪的要求,否則... – cosjav

+0

是啊,這是我的介紹comports類的任務 – user3044112

1

下面是一些僞代碼:

function createString(int times, char character){ 
    if times is 0, do nothing 
    otherwise return character + createString(times-1, character); 
} 

function createString(string full){ 
    split string by number/character pairs 
    for each pair, call createString(times, character), and append them 
} 

我不發放真正的代碼相信,對不起。長遠來看,這會更好。

0

* *編輯成遞歸按照任擇議定書的要求

測試左邊第一個字符前瞻解析器使用正則表達式

import java.util.regex.Pattern; 
import java.util.regex.Matcher; 

public class Parser{ 

private static String parse(StringBuilder output, String input, Integer offset){ 
    if(offset<input.length()){ 
     java.util.regex.Pattern p0 = 
      java.util.regex.Pattern.compile("\\d(?=[a-z])"); 

     java.util.regex.Pattern p1 = 
      java.util.regex.Pattern.compile("[a-z]"); 

     java.util.regex.Matcher m0 = p0.matcher(input); 
     java.util.regex.Matcher m1 = p1.matcher(input); 
     if (m0.find(offset) && m0.start() == offset) 
     { 
      for(Integer i = 0; 
       i < Integer.parseInt(String.valueOf(input.charAt(offset))); 
       ++i) { 
       output.append(input.charAt(offset+1)); 
      } 
      offset+=2; 
     } 
     else if (m1.find(offset) && m1.start() == offset) { 
      output.append(input.charAt(offset)); 
      ++offset; 
     } 
     else { 
      ++offset; 
     } 
     return parse(output, input, offset); 
    } 
    else return output.toString(); 
} 

public static void main(String[] args) 
{ 
    Integer offset = 0; 
    StringBuilder output = new StringBuilder(); 
    parse(output, args[0], offset); 
    System.out.println(output.toString());  
} 
}