Java 展开压缩字符串

Java 展开压缩字符串,java,parseint,charat,Java,Parseint,Charat,我试着取一个类似于这样的字符串:3A5o2n4t,并将其扩展回如下字符串:aaaoooontttt(字母前面的数字是字母重复的次数) 我试图使用Integer.parseInt()获取字母前面的数字,但它获取所有数字。有没有办法一次抓住一个号码?另外,在问题解决后,我的代码看起来还好吗?还是我还缺一点 public String runLengthDecoding(String str3) { String convert = ""; int number

我试着取一个类似于这样的字符串:3A5o2n4t,并将其扩展回如下字符串:aaaoooontttt(字母前面的数字是字母重复的次数) 我试图使用Integer.parseInt()获取字母前面的数字,但它获取所有数字。有没有办法一次抓住一个号码?另外,在问题解决后,我的代码看起来还好吗?还是我还缺一点

public String runLengthDecoding(String str3) {
          String convert = "";
          int number = 0;
          if (! str3.isEmpty()) {
             convert = str3.charAt(0) + "";
          }
          for (int i = 0; i <= str3.length() - 1; i++) { 
             if (Character.isDigit(str3.charAt(i))) { //true or false, the current character is a digit
                String temp = "" + str3.charAt(i); //if true, make that character a string
                number = Integer.parseInt(temp); /*now store that character as a number (but I only want the current
                                                   number, not all the numbers in the string*/
                System.out.println(number); /*Testing to see what number is, which is where I found it was 
                                               storing all the numbers */
                String temp2 = str3.charAt(i + 1) + ""; //Its supposed to start making a string that prints the character in front of it
                convert = temp2.repeat(number); //it will print the character however many times that number was stored as
             }

       }
       return convert;
       }
公共字符串运行长度解码(字符串str3){
字符串convert=“”;
整数=0;
如果(!str3.isEmpty()){
convert=str3.charAt(0)+”;
}
对于(int i=0;i编辑为:
-容纳长度超过1的字符串。例如:10AA
-容纳以字符串开头的输入。例如:A5o

要解决这个问题,你必须得到所有同时出现的数字,例如,如果你有“55s”,你必须得到“55”,这就是为什么您的代码是不正确的,因为如果您每次看到一个数字时都解析为parseInt,那么它将立即解析为5,但实际数字是55,因此您应该首先累加同时出现的数字,并且在遇到第一个非数字时只累加parseInt

有关详细信息,请参阅代码和注释:

public class Main {
    public static void main(String[] args) {
        System.out.println("Input: 3A5o2n4t => Output : " + runLengthDecoding("3A5o2n4t"));
        System.out.println("Input: 3AA5o2n4t => Output : " + runLengthDecoding("3AA5o2n4t"));
        System.out.println("Input: 10A5o2n4t => Output : " + runLengthDecoding("10A5o2n4t"));
        System.out.println("Input: 10AA5o2n4t => Output : " + runLengthDecoding("10AA5o2n4t"));
        System.out.println("Input: A5o => Output : " + runLengthDecoding("A5o"));
        System.out.println("Input: AB5o => Output : " + runLengthDecoding("AB5o"));
    }

    public static String runLengthDecoding(String str3) {
        String convert = "";
        int number = 0;
        String numberString = "";
        String toBeRepeatedString = "";
        boolean flag = false;
        for (int i = 0; i <= str3.length() - 1; i++) {
            char currentChar = str3.charAt(i);
            if (Character.isDigit(currentChar)) { // true or false, the current character is a digit
                numberString = numberString + currentChar; // store the possible integer
            } else {
                if (i + 1 < str3.length()) {
                    char nextChar = str3.charAt(i + 1); // check if the next char is a digit
                    if (!Character.isDigit(nextChar)) { // if not a digit then append toBeRepeatedString

                        if (i == 0 || i + 1 >= str3.length()) {
                            flag = true;
                        } else {
                            toBeRepeatedString += nextChar;
                            flag = false;
                        }
                    } else {
                        flag = true;
                    }
                }

                if (flag) {
                    toBeRepeatedString += currentChar;

                    // This will accomodate inputs "A3B";
                    if (!numberString.isEmpty()) {
                        number = Integer.parseInt(numberString); // parse the number of repeats
                    } else {
                        number = 1;
                    }

                    numberString = ""; // reset number

                    String temp2 = "";

                    // Repeat the currentChar
                    for (int j = 0; j < number; j++) {
                        temp2 += toBeRepeatedString;
                    }

                    convert = convert + temp2; // store it to the result
                    toBeRepeatedString = ""; // reset toBeRepeatedString
                }

            }

        }
        return convert;
    }

}

以下是解决上述问题的最佳方法,它将处理您的所有情况:

public static void main(String[] args) {
    String input = "5a2s3T66e";
    System.out.println("Input is: "+input+" and output is: "+expandingCondenseString(input));
}
private static String expandingCondenseString(String input){
    StringBuilder result = new StringBuilder();
    String size = "";
    String value = "";
    for (int i=0;i<input.length();i++){
        if (Character.isDigit(input.charAt(i))) {
            size = size + input.charAt(i);
        } else {
            value = value + input.charAt(i);
            if(i+1<input.length() && !Character.isDigit(input.charAt(i+1))){
                continue;
            }
            if(size.isEmpty()){
                size = "1";
            }
            for (int j=0;j<Integer.parseInt(size);j++){
                result.append(value);
            }
            size = "";
            value = "";
        }
    }
    return String.valueOf(result);
}
publicstaticvoidmain(字符串[]args){
字符串输入=“5a2s3T66e”;
System.out.println(“输入为:“+Input+”,输出为:“+ExpandingCongregateString(输入));
}
私有静态字符串扩展压缩字符串(字符串输入){
StringBuilder结果=新建StringBuilder();
字符串大小=”;
字符串值=”;

对于(int i=0;iIt似乎您在这里使用未定义的方法->
temp2.repeat(number);
当我查找repeat方法时,它被设置为String.repeat(int)。我认为它未定义,因为number不仅仅是1个数字。您可以在找到
String.repeat()的地方发布链接吗
method?您发布的是一个JavaScript方法。您正在使用Java。不要将JavaScript与Java混淆,反之亦然。如果true或false语句为true,我不想执行parseInt吗?numberString不是else语句中的一个空字符串吗?如果您有“55s”,则必须同时获取所有的int如果你看到一个数字就解析int,那么它会立即解析为5,但实际的数字是55,因此你应该累积同时的int,并且只在遇到一个非数字时解析。numberString将是这些可能数字的持有者,你在遇到一个数字时会追加这些数字,如果你遇到卸载一个非数字,然后首先将其转换为int,然后将numberString重置为空(“”),这样它就可以保存下一个可能的数字。好的,谢谢。我能够修复代码,以便在您的帮助下工作。但是,我注意到,如果我输入数字,字符将显示在字符后面,它将返回一个错误:“线程“main”java.lang.NumberFormatException中的异常:对于输入字符串:”“你知道这是为什么吗?(所以我不做3A5o2n4t而是做3O5N2T4)我已经编辑了我的答案,请检查。我还没有包括那个测试用例。我将编辑我的代码。请等待什么是try and catch?”?
public static void main(String[] args) {
    String input = "5a2s3T66e";
    System.out.println("Input is: "+input+" and output is: "+expandingCondenseString(input));
}
private static String expandingCondenseString(String input){
    StringBuilder result = new StringBuilder();
    String size = "";
    String value = "";
    for (int i=0;i<input.length();i++){
        if (Character.isDigit(input.charAt(i))) {
            size = size + input.charAt(i);
        } else {
            value = value + input.charAt(i);
            if(i+1<input.length() && !Character.isDigit(input.charAt(i+1))){
                continue;
            }
            if(size.isEmpty()){
                size = "1";
            }
            for (int j=0;j<Integer.parseInt(size);j++){
                result.append(value);
            }
            size = "";
            value = "";
        }
    }
    return String.valueOf(result);
}