在“特殊的”之前不能从字符串中删除所有字符

时间:2018-03-11 15:28:19

标签: java if-statement while-loop char

我尝试编写一个完整的十进制到二进制转换器,它工作得很好,现在我想从输出字符串中删除不必要的0,但它不会删除所有0并且我不知道为什么。

这是我的代码:

public class Converter {

private static final int[] ARRAY = {16348,8192,4096,2048,1024,512,256,128,64,32,16,8,4,2,1};

public static String toBinary(int number) {

    String output = new String();
    int number2 = number;

    for (int i=0; i<ARRAY.length ; i++) {

        if (number2 - ARRAY[i] >= 0) {
            output += "1";
            number2 -= ARRAY[i];
        }
        else {
            output += "0";
        }
    }

    boolean sorted = false;
    int i = 0 ;

    while (sorted == false) {

        if (output.charAt(i) == '0') {
            StringBuilder temp = new StringBuilder(output);
            temp.deleteCharAt(i);
            output = temp.toString();
            i ++;
        }
        else{
            sorted = true;
        }
    }

    return output;
}

}

4 个答案:

答案 0 :(得分:0)

我建议使用更简单的解决方案,通过将输出解析为int x = Integer.valueOf(output); // if you wanted the output as string String val = String.valueOf(x); 来删除尾随零 使用这个

{
    "compilerOptions": {
        "target": "es5",
        "downlevelIteration": true
    }
}

答案 1 :(得分:0)

这是因为变量i指向错误的位置。这是因为在0移除i后,您正在递增i

例如,取字符串00001(根据位数缩小)
i = 0,在删除索引0的{​​{1}}后,我们得到i。递增0001变为i。 在1后,在删除索引i = 1处的0后,我们会获得i。递增001变为i。 (我们已经跳过了第一个0)。

删除2即可。但是,您的代码仍无法用于输入i++。在while循环中,您仍然需要验证索引0并通过检查i字符串是否为空来打破while循环。

一个简单的解决方案是使用this answer.

中建议的output

或者另一个单行将是:

Integer.valueOf

答案 2 :(得分:0)

最好不要首先添加前导零。为什么要创建,然后删除?在检测到一个之前,此方法不会添加前导零:

public static String toBinary(int number) {

    String output = new String();
    int number2 = number;

    boolean foundOne = false;
    for (int i=0; i<ARRAY.length ; i++) {

        if (number2 - ARRAY[i] >= 0) {
            output += "1";
            number2 -= ARRAY[i];
            foundOne = true;
        }
        else if (foundOne){
            output += "0";
        }
    }
    if (!foundOne)
        output = "0";

    return output;
}

答案 3 :(得分:0)

String s = "00010101"
System.out.println(s.replaceAll("^0*", "")) 
// => 10101

这是使用正则表达式的示例 ^表示表达式应仅匹配字符串的开头 0*匹配重复0零次或多次的任何字符串