Cela fait longtemps que je n’ai pas utilisé Java, ma syntaxe n’est pas la meilleure pour le moment.
Je souhaite vérifier qu'une variable de caractère est l'un des 21 caractères spécifiques. Quel est le moyen le plus rapide de procéder?
Par exemple:
if(symbol == ('A'|'B'|'C')){}
Ne semble pas fonctionner. Dois-je l'écrire comme ceci:
if(symbol == 'A' || symbol == 'B' etc.)
Si votre saisie est un caractère et que les caractères que vous vérifiez sont pour la plupart consécutifs, vous pouvez essayer ceci:
if ((symbol >= 'A' && symbol <= 'Z') || symbol == '?') {
// ...
}
Toutefois, si votre entrée est une chaîne, une approche plus compacte (mais plus lente) consiste à utiliser une expression régulière avec une classe de caractères:
if (symbol.matches("[A-Z?]")) {
// ...
}
Si vous avez un caractère, vous devez d'abord le convertir en chaîne avant de pouvoir utiliser une expression régulière:
if (Character.toString(symbol).matches("[A-Z?]")) {
// ...
}
Si vous connaissez tous vos 21 caractères à l'avance, vous pouvez les écrire tous sous la forme d'une chaîne, puis vérifiez-les comme suit:
char wanted = 'x';
String candidates = "abcdefghij...";
boolean hit = candidates.indexOf(wanted) >= 0;
Je pense que c'est le chemin le plus court.
La première déclaration que vous avez n’est probablement pas celle que vous voulez ... 'A'|'B'|'C'
effectue en fait une opération au niveau du bit :)
Votre deuxième déclaration est correcte, mais vous aurez 21 blocs opératoires.
Si les 21 caractères sont "consécutifs", les solutions ci-dessus conviennent.
Sinon, vous pouvez pré-calculer un jeu de hachage de caractères valides et faire quelque chose comme
if (validCharHashSet.contains(symbol))...
Si vous avez des caractères spécifiques, soyez:
Collection<Character> specificChars = Arrays.asList('A', 'D', 'E'); // more chars
char symbol = 'Y';
System.out.println(specificChars.contains(symbol)); // false
symbol = 'A';
System.out.println(specificChars.contains(symbol)); // true
Il pourrait être plus clair sous la forme d’une instruction switch avec fall through, par exemple.
switch (symbol){
case 'A':
case 'B':
// Do stuff
break;
default:
}
Utiliser Goyave :
if (CharMatcher.anyOf("ABC...").matches(symbol)) { ... }
Ou si plusieurs de ces caractères sont une plage, telle que "A" à "U" mais que certains ne le soient pas:
CharMatcher.inRange('A', 'U').or(CharMatcher.anyOf("1379"))
Vous pouvez également déclarer cela comme un champ static final
afin que le correcteur ne soit pas créé à chaque fois.
private static final CharMatcher MATCHER = CharMatcher.anyOf("ABC...");
L'option 2 fonctionnera. Vous pouvez également utiliser un Set<Character>
ou
char[] myCharSet = new char[] {'A', 'B', 'C', ...};
Arrays.sort(myCharSet);
if (Arrays.binarySearch(myCharSet, symbol) >= 0) { ... }
vous pouvez utiliser ceci:
if ("ABCDEFGHIJKLMNOPQRSTUVWXYZ".contains(String.valueOf(yourChar)))
notez qu'il n'est pas nécessaire de créer une chaîne séparée avec les lettres A à Z.
Une façon de le faire en utilisant un List<Character>
construit à l'aide de méthodes de fabrique de commodité surchargées dans Java9 est la suivante:
if(List.of('A','B','C','D','E').contains(symbol) {
// do something
}
Vous pouvez simplement écrire vos caractères sous forme de chaînes et utiliser la méthode equals.
Par exemple:
String firstChar = "A";
String secondChar = "B";
String thirdChar = "C";
if (firstChar.equalsIgnoreCase(secondChar)) ||
(firstChar.equalsIgnoreCase(thirdChar))) // As many equals as you want
{
System.out.println(firstChar + " is the same as " + secondChar);
}
else
{
System.out.println(firstChar + " is different than " + secondChar);
}
Oui, vous devez l'écrire comme votre deuxième ligne. Java n'a pas le sucre syntaxique de style python de votre première ligne.
Vous pouvez également placer vos valeurs valides dans un tableau et vérifier l'existence de symbol
dans le tableau.
pseudocode car je n'ai pas de SDK Java sur moi:
Char candidates = new Char[] { 'A', 'B', ... 'G' };
foreach(Char c in candidates)
{
if (symbol == c) { return true; }
}
return false;