测试char数组是否包含一些字母

时间:2015-11-16 23:55:50

标签: java boolean-logic

我有char[],必须由字母'R', 'B', 'O', 'V', 'J', 'F', 'I', 'N'组成。我必须检查数组是否只包含这些字母,如果没有,我需要重新引入字母,直到它包含正确的字母。

我通过一种方法(不起作用)来做到这一点:

boolean validation=false;
if (choixJoueur.length != 4) {
    validation=false;
} else {
   for (int i = 0; i < 4; i++) {
       if (choixJoueur[i] != 'R' || choixJoueur[i] != 'B'
                || choixJoueur[i] != 'O' || choixJoueur[i] != 'V'
                || choixJoueur[i] != 'J' || choixJoueur[i] != 'F'
                || choixJoueur[i] != 'I' || choixJoueur[i] != 'N')) {
            validation=false;

        } else
            validation=true;
    }
}

如果我使用RBVD对其进行测试,则验证(正确)计算为false,但如果我尝试RBVO,则验证(错误地)false。< / p>

3 个答案:

答案 0 :(得分:0)

if (choixJoueur[i] != 'R' || choixJoueur[i] != 'B'
            || choixJoueur[i] != 'O' || choixJoueur[i] != 'V'
            || choixJoueur[i] != 'J' || choixJoueur[i] != 'F'
            || choixJoueur[i] != 'I' || choixJoueur[i] != 'N')) {
        validation=false;

    }else
        validation=true;
}

让我们调试您的代码:

您的输入例如:RBVD然后:

R != R is false but R != B is true so validation = false
B != R is true so validation = false
V != R is true so validation = false
D != R is true so validation = false

你的第二次输入仍然是假的。

您可能希望在||验证中更改&& if以验证所有可能性。

此外,如果验证为false,您可能需要break for-loop :)(或者我的猜测)

如果更改为&&,这将是调试:

R != R is false so validation = true
B != R is true but B != B is false so validation = true
V != R is true but V != V is false so validation = true
D != R is true and D is different from all of the rest of letters, so validation = false

另一方面RBVO

R != R is false so validation = true
B != R is true but B != B is false so validation = true
V != R is true but V != V is false so validation = true
O != R is true but O != O is false so validation = true

完成所有这些后,if语句应为:

if (choixJoueur[i] != 'R' && choixJoueur[i] != 'B'
            && choixJoueur[i] != 'O' && choixJoueur[i] != 'V'
            && choixJoueur[i] != 'J' && choixJoueur[i] != 'F'
            && choixJoueur[i] != 'I' && choixJoueur[i] != 'N')) {
        validation=false;
        break; //because I guess if it contains any of the letters the validation fails, if you don't and the next letter is a valid one it will override validation to true.

    }else
        validation=true;
}

您也可以将其更改为:

boolean validate = true;

并删除else中的for-loop语句。但是仍然要考虑break语句,因为它会阻止程序在发现它无效时(例如在第一个字母或类似的东西上)知道它是无效输入时执行更多操作。

答案 1 :(得分:0)

Frakcool对第一部分是正确的。你想要检查一个字符{不是R,它不是B,它不是O,AND ...}。目前,您正在检查单个字符{不是R,OR不是B,OR不是O,OR ...}。这不起作用,因为现有的每个字符都不是R或不是B.

您还有另一个问题,即您只是有效地检查最后一个字符是否是其中一个字符,因为对于每个字符,您重置“验证”的值而不考虑过去的失败。换句话说,如果第一个字母失败但最后一个字母通过,您只需将验证设置为true,即使它应该为false。相反,最好只使用true开始,并在遇到失败条件时将其设置为false,而不再将其设置为true。

import java.io.IOException;

public class Main
{
    public static void main(String[] args) throws IOException
    {
        char[] choixJoueur = { 'R', 'B', 'V', 'O' };

        boolean validation = true;

        if (choixJoueur.length != 4)
            validation = false;
        else
        {
            for (int i = 0; i < 4; i++)
            {
                if (choixJoueur[i] != 'R' && choixJoueur[i] != 'B'
                        && choixJoueur[i] != 'O' && choixJoueur[i] != 'V'
                        && choixJoueur[i] != 'J' && choixJoueur[i] != 'F'
                        && choixJoueur[i] != 'I' && choixJoueur[i] != 'N')
                {
                    validation = false;
                }
            }
        }

        System.out.println(validation);
    }
}

答案 2 :(得分:0)

问题在于逻辑;你应该在你的条件之间使用&&(而不是||)(每个字符等于至少一个测试的字符)。

但是你可以通过使用正则表达式来大大简化你的代码,它可以在一行中完成:

boolean validation = new String(choixJoueur).matches("[RBOVJFIN]{4}");

如果你还想断言不会多次使用任何字符:

boolean validation = new String(choixJoueur).matches("((?!(.).*\\1)[RBOVJFIN]){4}");