代码注释:
有一个内置方法可以获取字符串的字符数组char[]
,因此以下两个代码块是相同的:
char[] ch = new char[value.length()];
for (int i = 0; i < value.length(); i++) {
ch[i] = value.charAt(i);
}
char[] ch = value.toCharArray();
在循环时递增一个值时最好使用 for
循环。以下两种编写循环的方式行为相同,但 for
循环将循环逻辑保持在一起:
int i = 0;
while (i+2 < ch.length) {
i=i+3;
}
for (int i = 0; i + 2 < ch.length; i=i+3) {
}
以下代码行完全错误:
int b= ch[i]+ch[i++]+ch[i+2];
i++
会将i
的值加1,但在表达式中使用的是增加前的值,这意味着如果在该行之前i=0
,则结果与此代码相同:
int b = ch[0] + ch[0] + ch[2];
i = i + 1;
您需要用i+1
替换i++
,并意识到它们不是相同的。
由于在该语句中不再将i
的值增加1,因此必须将循环从i=i+3
更改为i=i+4
,以正确跳过输入中的空格。
ch[i]
的值是一个char
值,通过使用+
运算符扩展为int
值。 char
的int
值是Unicode代码点值,对于您的文本也是字符的ASCII代码。
这意味着如果i=0
,则表达式(修复问题#1后)将计算为:
int b = ch[0] + ch[1] + ch[2];
int b = `1` + `0` + `4`;
int b = 49 + 48 + 52;
int b = 149;
这与运行问题中的代码的输出匹配,其中第二个打印的数字是149
(修复问题#1后)。
你真正想要的是获取子字符串"104"
并将其转换为数字,然后将该ASCII码值强制转换为char
,像这样:
String numberStr = value.substring(i, i + 3);
int number = Integer.parseInt(numberStr);
String str = String.valueOf((char) number);
有了这个,你就不再需要 char[]
了,所以最终的代码将是:
String value = "104 101 108 108 111";
String ans = "";
for (int i = 0; i + 2 < value.length(); i += 4) {
String numberStr = value.substring(i, i + 3);
int number = Integer.parseInt(numberStr);
String str = String.valueOf((char) number);
ans = ans + str;
}
System.out.println(ans);
输出
hello
ch[i++]
改为ch[i+1]
。 - JCWasmx86