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