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.)
45
demandé sur royhowie 2011-02-17 23:59:15

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?]")) {
    // ...
}
62
répondu Mark Byers 2011-02-17 21:07:23

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.

10
répondu Marc 2011-02-17 21:15:19

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))...
5
répondu Alvin 2011-02-17 21:03:40

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:
}
3
répondu Richard Miskin 2011-02-17 21:05:42

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           
3
répondu smas 2011-02-17 21:16:22

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...");
2
répondu ColinD 2011-02-17 21:21:53

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
répondu rlibby 2011-02-17 21:03:26

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.

1
répondu Daniel He 2015-10-16 04:02:01

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.

0
répondu Endophage 2011-02-17 21:01:50

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
répondu tenpn 2011-02-17 21:03:04

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);
    }
0
répondu Anony 2014-11-16 21:59:11

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
}
0
répondu nullpointer 2017-09-28 19:40:32