对于我需要编写方法的代码,解压缩字符串。例如,如果用户输入“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';
}
答案 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());
}
}