基本的java程序不工作

时间:2013-11-28 02:28:29

标签: java

对于我需要编写方法的代码,解压缩字符串。例如,如果用户输入“2d5t”,则该方法将返回“ddttttt”。我的代码现在可以用于输入,但是如果输入使用的是一个没有数字的字符,那么程序就不会工作了。例如,如果输入只是“d”,则程序将无法工作而不仅仅返回“d”。代码也必须是递归的。 以下是我的代码现在请帮助。

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

4 个答案:

答案 0 :(得分: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
}

对不起,我不相信分发实际代码。从长远来看,它会好得多。

答案 1 :(得分:0)

您需要验证您的用户输入。首先确定您的方法可接受哪些字符串值,然后编写验证方法。然后在您的解压缩方法中调用该方法。 在Java中查看string manipulation函数和regular expressions。然后尝试重写代码。

答案 2 :(得分: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的数字,您可能还希望在其中添加一些错误处理和验证。

答案 3 :(得分:0)

* *根据OP的要求编辑为递归

使用正则表达式测试左前第一个char前瞻解析器

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