-1

该方法应该检查输入的数字是否是数字而不是字母,然后完成功能。但是,每次我尝试它总是说输入错误。

例如:

如果我输入“5 * 5”

它说 Error Incorrect Input Re-input your numbers:

当它不应该做任何事情时。我想不通。

我的代码是:

 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();
            }
    }
}
4

5 回答 5

2

让我们重新格式化并简化您的代码。首先,我们简化blabla == '0' || blabla == '1' || ... || blabla == '9'to blabla >= '0' && blabla <= '9'

之后让我们减少if (x) { y = true; } else { y = false; }y = x;.

第三,在您的情况下,我们可以将 for 循环中的i++andk++设为其增量表达式,因为它们在每次迭代中仅增加一次,并且在每次迭代后不会用于其他任何事情。

第四,如果 fors 依赖某个数字,让我们尝试用这些数字初始化它们。valid = true用和初始化它们valid1 = true是不必要的,因为此时这些变量已经为真。

x == true第五,使用when is boolean这样的表达式x可以简化为x.

第六,你的string变量是无用的,因为它总是一样input的。让我们使用input.

第七,您没有使用变量string1and string2(相反,您正在使用strings[0]and 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 循环内。这真的是故意的吗?我想不是。将它移到循环之外。

  • 无论它们以前的值如何,都在循环中重置validand 。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();
    }
}
于 2013-05-27T20:08:13.163 回答
1

你写过你给字符串“5 * 5” - 还是“5 * 5”?您不会过滤掉空格。

于 2013-05-27T19:08:33.943 回答
0

strings[0]值为“5”,因此循环的第一遍看到 5 并将 valid 设置为 true,然后循环的第二遍出现,看到空格字符,并将其设置回 false。您需要想出一种处理空间的方法。

于 2013-05-27T19:08:10.303 回答
0

这行代码无效

String[] strings = string.split("\\*");

因为string不是一个声明的变量string.split("\\*");

于 2013-05-27T19:11:10.820 回答
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
于 2013-05-27T19:07:31.223 回答