此方法应检查输入的数字是否为数字而不是字母,然后完成该功能。但是,每次我尝试它总是说输入是错误的。
例如:
如果我输入“5 * 5”
它表示错误输入错误 重新输入您的号码:
什么时候不应该做什么。我无法弄清楚。
我的代码是:
public void multiply() throws IOException {
boolean valid = true;
boolean valid1 = true;
int i = 0;
int k = 0;
String string = input;
String[] strings = string.split("\\*");
String string1 = strings[0];
String string2 = strings[1];
for (valid = true; i < strings[0].length();) {
if (strings[0].charAt(i) == '0'
|| strings[0].charAt(i) == '1'
|| strings[0].charAt(i) == '2'
|| strings[0].charAt(i) == '3'
|| strings[0].charAt(i) == '4'
|| strings[0].charAt(i) == '5'
|| strings[0].charAt(i) == '6'
|| strings[0].charAt(i) == '7'
|| strings[0].charAt(i) == '8'
|| strings[0].charAt(i) == '9'
|| strings[0].charAt(i) == '*') {
valid = true;
} else {
valid = false;
}
i++;
}
for (valid1 = true; k < strings[1].length();) {
if (strings[1].charAt(k) == '0'
|| strings[1].charAt(k) == '1'
|| strings[1].charAt(k) == '2'
|| strings[1].charAt(k) == '3'
|| strings[1].charAt(k) == '4'
|| strings[1].charAt(k) == '5'
|| strings[1].charAt(k) == '6'
|| strings[1].charAt(k) == '7'
|| strings[1].charAt(k) == '8'
|| strings[1].charAt(k) == '9'
|| strings[1].charAt(k) == '*') {
valid1 = true;
} else {
valid1 = false;
}
k++;
if (valid1 == true && valid == true) {
System.out.println("Multiply");
//Going to finish
} else {
System.out.println("Error Incorrect Input");
System.out.println("Re-input your numbers:");
check();
}
}
}
答案 0 :(得分:2)
让我们重新格式化并简化您的代码。首先,我们将blabla == '0' || blabla == '1' || ... || blabla == '9'
简化为blabla >= '0' && blabla <= '9'
。
之后,我们将if (x) { y = true; } else { y = false; }
缩减为y = x;
。
第三,在你的情况下,我们可以使for循环中的i++
和k++
成为增量表达式,因为它们在每次迭代中仅增加一次,在每次迭代中都不会用于任何事情否则在他们增加之后。
第四,如果fors正在指望一些数字,让我们尝试用这些数字初始化它们。使用valid = true
和valid1 = true
初始化它们是不必要的,因为此时这些变量已经为真。
当x == true
为布尔值时,使用x
这样的表达式可以简化为x
。
第六,您的string
变量无用,因为它始终与input
相同。我们只使用input
。
第七,您没有使用变量string1
和string2
(而是使用strings[0]
和strings[1]
)。我们来使用它们。
完成这些转换之后,现在就是您的代码:
public void multiply() throws IOException {
boolean valid = true;
boolean valid1 = true;
String[] strings = input.split("\\*");
String string1 = strings[0];
String string2 = strings[1];
for (int i = 0; i < string1.length(); i++) {
valid = ((string1.charAt(i) >= '0' && string1.charAt(i) <= '9')
|| string1.charAt(i) == '*');
}
for (int k = 0; k < string2.length(); k++) {
valid1 = ((string2.charAt(k) >= '0' && string2.charAt(k) <= '9')
|| string2.charAt(k) == '*');
if (valid1 && valid) {
System.out.println("Multiply");
//Going to finish
} else {
System.out.println("Error Incorrect Input");
System.out.println("Re-input your numbers:");
check();
}
}
}
现在,我们可以轻松发现一些问题:
if (valid1 && valid)
(原if (valid1 == true && valid == true)
)位于第二个for循环内。这是真的有意吗?我想不是。将它移到你的循环之外。
您重置了循环中的valid
和valid1
,无论其先前的值如何。这相当于只检查最后一个字符。你真正想要的是valid
和valid1
只有在每个字符都有效时才应该是真的。
由于您使用input
正则表达式分割"\\*"
变量,因此您不会在任何生成的字符串中获得*
,因此您无需任何需要检查一下。
您没有过滤空格。
让我们解决这些问题:
public void multiply() throws IOException {
boolean valid = true;
boolean valid1 = true;
String[] strings = input.split("\\*");
String string1 = strings[0].trim();
String string2 = strings[1].trim();
for (int i = 0; i < string1.length(); i++) {
valid &= string1.charAt(i) >= '0' && string1.charAt(i) <= '9';
}
for (int k = 0; k < string2.length(); k++) {
valid1 &= string2.charAt(k) >= '0' && string2.charAt(k) <= '9';
}
if (valid1 && valid) {
System.out.println("Multiply");
//Going to finish
} else {
System.out.println("Error Incorrect Input");
System.out.println("Re-input your numbers:");
check();
}
}
答案 1 :(得分:1)
你写过你给的是字符串“5 * 5” - 还是“5 * 5”?你不会过滤掉空格。
答案 2 :(得分:0)
为什么不在char数组上使用isDigit()?
循环中的Character.isDigit(strings[1].charAt(k))
之类的东西会告诉你它是否是一个数字(处理*左边作为海报的练习):
String s = "This is string 1";
char[] charArray = s.toCharArray();
for(int x=0;x<charArray.length;x++){
if(Character.isDigit(charArray[x])){
System.out.println("True");
} else {
System.out.println("FALSE");
}
}
输出:
FALSE
FALSE
FALSE
FALSE
FALSE
FALSE
FALSE
FALSE
FALSE
FALSE
FALSE
FALSE
FALSE
FALSE
FALSE
True
答案 3 :(得分:0)
strings[0]
的值为“5”,因此循环的第一次传递看到5并将有效值设置为true,然后循环的第二次传递出现,查看空格字符并将其设置回为假。你需要想出办法来处理空间。
答案 4 :(得分:0)
这行代码无效
String[] strings = string.split("\\*");
因为string
不是string.split("\\*");