Comparando caracteres en Java

3 minutos de lectura

avatar de usuario
Alex

Quiero verificar que una variable de caracteres sea uno de los 21 caracteres específicos, ¿cuál es la forma más corta en que puedo hacer esto?

Por ejemplo:

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

No parece estar funcionando. ¿Necesito escribirlo como:

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

  • Sí, esa es una forma. Echa un vistazo a expresiones regulares

    – preguntas

    17 de febrero de 2011 a las 21:02

avatar de usuario
marca byers

Si su entrada es un carácter y los caracteres con los que está comprobando son en su mayoría consecutivos, puede intentar esto:

if ((symbol >= 'A' && symbol <= 'Z') || symbol == '?') {
    // ...
}

Sin embargo, si su entrada es una cadena, un enfoque más compacto (pero más lento) es usar una expresión regular con una clase de caracteres:

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

Si tiene un carácter, primero deberá convertirlo en una cadena antes de poder usar una expresión regular:

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

  • +1 así es como lo haría si en su mayor parte los 21 símbolos son consecutivos.

    – Endófago

    17 de febrero de 2011 a las 21:03

  • Gracias Mark, he usado expresiones regulares antes pero nunca con Java, ¡ni siquiera sabía que podías!

    – Alex

    17 de febrero de 2011 a las 21:16

  • Oracle doc resume bastante la respuesta y proporciona fallas a la respuesta anterior, así que eche un vistazo. docs.oracle.com/javase/tutorial/i18n/text/charintro.html.

    – Saurabh Gupta

    23 de febrero de 2020 a las 22:59


Si conoce todos sus 21 caracteres de antemano, puede escribirlos todos como una Cadena y luego verificarlo así:

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

Creo que este es el camino más corto.

  • Solución muy elegante. Felicitaciones.

    – Draško

    22 de marzo de 2017 a las 15:26

La primera declaración que tienes probablemente no es lo que quieres… 'A'|'B'|'C' en realidad está haciendo una operación bit a bit 🙂

Su segunda declaración es correcta, pero tendrá 21 OR.

Si los 21 caracteres son “consecutivos”, las soluciones anteriores están bien.

Si no, puede calcular previamente un conjunto hash de caracteres válidos y hacer algo como

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

avatar de usuario
daniel el

puedes usar esto:

if ("ABCDEFGHIJKLMNOPQRSTUVWXYZ".contains(String.valueOf(yourChar)))

tenga en cuenta que no necesita crear una Cadena separada con las letras AZ.

Podría estar más claro escrito como una declaración de cambio con caída, por ejemplo

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

avatar de usuario
lukastimo

Si tiene caracteres específicos debe ser:

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           

Utilizando Guayaba:

if (CharMatcher.anyOf("ABC...").matches(symbol)) { ... }

O si muchos de esos caracteres son un rango, como “A” a “U”, pero algunos no lo son:

CharMatcher.inRange('A', 'U').or(CharMatcher.anyOf("1379"))

También puede declarar esto como un static final campo para que el comparador no tenga que crearse cada vez.

private static final CharMatcher MATCHER = CharMatcher.anyOf("ABC...");

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad