【问题标题】:Cant remove all chars from a string before a "special one"不能在“特殊字符”之前从字符串中删除所有字符
【发布时间】:2018-03-11 15:28:19
【问题描述】:

我尝试编写一个完整的十进制到二进制转换器,它工作得很好,现在我想从我的输出字符串中删除不必要的 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;
}

}

【问题讨论】:

  • 例如,当我使用 7 的二进制文件时,它只会从字符串中删除前 6 个 0。

标签: java if-statement while-loop char


【解决方案1】:

这是因为变量i 指向了错误的位置。这是因为在您删除ith 处的0 后,您将增加i

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

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

一个简单的解决方案是按照this answer. 中的建议使用Integer.valueOf

或者另一个单行是:

String result = output.contains("1") ? output.substring(output.indexOf("1")) : "0";

【讨论】:

    【解决方案2】:

    我建议使用更简单的解决方案,通过将输出解析为 Integer 来删除尾随零 用这个

    int x = Integer.valueOf(output);
    // if you wanted the output as string 
    String val = String.valueOf(x);
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 谢谢,您的回答可能对我来说是最有意义的,我应该如何做到这一点。 (我没有将其标记为最佳答案,因为它没有直接回答,为什么只删除了 6 个零)
      • 我明白了。您仍然可以选择认为它有用。感谢您的考虑。
      【解决方案4】:
      String s = "00010101"
      System.out.println(s.replaceAll("^0*", "")) 
      // => 10101
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-02-22
        • 2012-12-16
        • 2011-04-11
        • 2016-01-23
        相关资源
        最近更新 更多