web-dev-qa-db-fra.com

Comparer les caractères en Java

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.)
47
Alex

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?]")) {
    // ...
}
65
Mark Byers

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.

11
Marc

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))...
6
Alvin

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           
3
smas

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:
}
3
Richard Miskin

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...");
2
ColinD

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) { ... }
1
rlibby

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. 

1
Daniel He

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
}
0
nullpointer

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);
    }
0
Anony

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.

0
Endophage

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;
0
tenpn