Comparaison des caractères en Java
Cela fait un moment que je n'ai pas fait de Java, donc ma syntaxe n'est pas la meilleure pour le moment.
Je veux vérifier qu'une variable char est l'un des 21 caractères spécifiques, Quel est le moyen le plus court de le faire?
Par exemple:
if(symbol == ('A'|'B'|'C')){}
Ne semble pas fonctionner. Ai-je besoin de l'écrire comme:
if(symbol == 'A' || symbol == 'B' etc.)
12 réponses
Si votre entrée est un caractère et que les caractères que vous utilisez sont pour la plupart consécutifs, vous pouvez essayer ceci:
if ((symbol >= 'A' && symbol <= 'Z') || symbol == '?') {
// ...
}
Cependant, 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 comme une chaîne et ensuite le vérifier comme ceci:
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 est probablement pas ce que vous voulez... 'A'|'B'|'C'
est en train de faire une opération au niveau du BIT:)
Votre deuxième déclaration est correcte, mais vous aurez 21 ORs.
Si les 21 caractères sont "consécutifs", les solutions ci-dessus sont correctes.
Si ce n'est pas le cas, vous pouvez pré-calculer un jeu de caractères valides et faire quelque chose comme
if (validCharHashSet.contains(symbol))...
Il pourrait être plus clair écrit comme une déclaration de commutateur avec fall through par exemple
switch (symbol){
case 'A':
case 'B':
// Do stuff
break;
default:
}
Si vous avez des caractères spécifiques devrait être:
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
En Utilisant Goyave :
if (CharMatcher.anyOf("ABC...").matches(symbol)) { ... }
Ou si beaucoup de ces caractères sont une plage, comme "A" à " U " mais certains ne le sont pas:
CharMatcher.inRange('A', 'U').or(CharMatcher.anyOf("1379"))
Vous pouvez également déclarer cela comme un champ static final
afin que le matcher n'ait pas besoin d'être 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 que vous n'avez pas besoin de créer une chaîne séparée avec les lettres A-Z.
Oui, vous devez l'écrire comme votre seconde 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;
Vous pouvez simplement écrire vos caractères en tant que 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);
}
Une façon de le faire en utilisant un List<Character>
Construit en utilisant des méthodes d'usine de commodité surchargées dans java9 est comme:
if(List.of('A','B','C','D','E').contains(symbol) {
// do something
}