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 final
veld, 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 symbol
in 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);
}