我有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>
答案 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}");