这种方法有什么问题?它每次都会变回虚假

时间:2013-05-27 19:03:33

标签: java boolean

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

例如:

如果我输入“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();
            }
    }
}

5 个答案:

答案 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 = truevalid1 = true初始化它们是不必要的,因为此时这些变量已经为真。

x == true为布尔值时,使用x这样的表达式可以简化为x

第六,您的string变量无用,因为它始终与input相同。我们只使用input

第七,您没有使用变量string1string2(而是使用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循环内。这是真的有意吗?我想不是。将它移到你的循环之外。

  • 您重置了循环中的validvalid1,无论其先前的值如何。这相当于只检查最后一个字符。你真正想要的是validvalid1只有在每个字符都有效时才应该是真的。

  • 由于您使用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("\\*");

中的声明变量