74 votes

Comparaison de caractères en Java

Je veux vérifier qu'une variable char est l'un des 21 chars spécifiques, quelle est la façon la plus courte de le faire ?

Par exemple :

if(symbol == ('A'|'B'|'C')){}

Ça n'a pas l'air de fonctionner. Dois-je l'écrire comme :

if(symbol == 'A' || symbol == 'B' etc.)

0 votes

Oui, c'est une façon de faire. Jetez un coup d'oeil à regex

87voto

Mark Byers Points 318575

Si votre entrée 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 == '?') {
    // ...
}

Cependant, si votre entrée est une chaîne de caractères, 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 devrez d'abord le convertir en chaîne de caractères avant de pouvoir utiliser une expression régulière :

if (Character.toString(symbol).matches("[A-Z?]")) {
    // ...
}

0 votes

+1 c'est ainsi que je procéderais si la plupart des 21 symboles sont consécutifs.

0 votes

Merci Mark, j'ai utilisé regex avant mais jamais avec Java, je ne savais même pas qu'on pouvait le faire !

0 votes

Le document Oracle résume en gros la réponse et fournit des failles dans la réponse ci-dessus, alors jetez-y un œil. docs.oracle.com/javase/tutorial/i18n/text/charintro.html .

17voto

Marc Points 510

Si vous connaissez à l'avance vos 21 caractères, vous pouvez les écrire sous la forme d'une seule chaîne et la vérifier comme suit :

char wanted = 'x';
String candidates = "abcdefghij...";
boolean hit = candidates.indexOf(wanted) >= 0;

Je pense que c'est le chemin le plus court.

0 votes

Une solution très élégante. Félicitations.

6voto

Alvin Points 3991

La première déclaration que vous avez n'est probablement pas ce que vous voulez... 'A'|'B'|'C' fait en fait une opération bit par bit :)

Votre deuxième affirmation est correcte, mais vous aurez 21 OR.

Si les 21 caractères sont "consécutifs", les solutions ci-dessus conviennent.

Si ce n'est pas le cas, vous pouvez pré-calculer un ensemble de hachage de caractères valides et faire quelque chose comme

if (validCharHashSet.contains(symbol))...

5voto

Richard Miskin Points 1052

Il serait peut-être plus clair de l'écrire sous la forme d'une déclaration de commutation avec une chute, par exemple.

switch (symbol){
    case 'A':
    case 'B':
      // Do stuff
      break;
     default:
}

3voto

smas Points 8299

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

0 votes

+1 pour une approche alternative parfaitement adaptée, qui pourrait être meilleure pour de nombreux personnages.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X