Tekens vergelijken in Java

Ik wil controleren of een char-variabele een van de 21 specifieke chars is, wat is de kortste manier om dit te doen?

Bijvoorbeeld:

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

Het lijkt niet te werken. Moet ik het zo schrijven:

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

Antwoord 1, autoriteit 100%

Als je invoer een teken is en de tekens die je controleert zijn meestal opeenvolgend, kun je dit proberen:

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

Als uw invoer echter een tekenreeks is, is een compactere benadering (maar langzamer) het gebruik van een reguliere expressie met een tekenklasse:

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

Als je een teken hebt, moet je het eerst naar een tekenreeks converteren voordat je een reguliere expressie kunt gebruiken:

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

Antwoord 2, autoriteit 17%

Als je al je 21 tekens van tevoren weet, kun je ze allemaal als één tekenreeks schrijven en het dan als volgt aanvinken:

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

Ik denk dat dit de kortste weg is.


Antwoord 3, autoriteit 7%

Het eerste statement dat je hebt is waarschijnlijk niet wat je wilt… 'A'|'B'|'C'doet eigenlijk een bitsgewijze bewerking 🙂

Uw tweede verklaring is correct, maar u hebt 21 ORS.

Als de 21 tekens “opeenvolgend” zijn, is de bovenstaande oplossingen prima.

Zo niet, u kunt een hash-set van geldige tekens pre-berekenen en iets als

doen

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

Antwoord 4, Autoriteit 4%

Het kan duidelijker zijn geschreven als een schakelafschrift met daling van bijvoorbeeld bijvoorbeeld.

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

Antwoord 5, Autoriteit 4%

Als u specifieke tekens heeft, moet:

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           

Antwoord 6, Autoriteit 4%

U kunt dit gebruiken:

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

Merk op dat u geen afzonderlijke reeks hoeft te maken met de letters A-Z.


Antwoord 7, Autoriteit 2%

met guava :

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

of als veel van die karakters een bereik zijn, zoals “A” tot “u”, maar sommige zijn niet:

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

Je kunt dit ook declareren als een static finalveld, zodat de matcher niet elke keer hoeft te worden aangemaakt.

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

Antwoord 8

Optie 2 zal werken. U kunt ook een Set<Character>of

. gebruiken

char[] myCharSet = new char[] {'A', 'B', 'C', ...};
Arrays.sort(myCharSet);
if (Arrays.binarySearch(myCharSet, symbol) >= 0) { ... }

Antwoord 9

Ja, je moet het schrijven als je tweede regel. Java heeft niet de syntactische suiker in python-stijl van je eerste regel.

U kunt ook uw geldige waarden in een array plaatsen en controleren op het bestaan van symbolin de array.


Antwoord 10

pseudocode omdat ik geen Java SDK bij me heb:

Char candidates = new Char[] { 'A', 'B', ... 'G' };
foreach(Char c in candidates)
{
    if (symbol == c) { return true; }
}
return false;

Antwoord 11

Een manier om dit te doen met behulp van een List<Character>die is samengesteld met behulp van overbelaste gemaksfabrieksmethoden in java9is als :

if(List.of('A','B','C','D','E').contains(symbol) {
    // do something
}

Antwoord 12

Je kunt je tekens gewoon als Strings schrijven en de equals-methode gebruiken.

Bijvoorbeeld:

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

Other episodes