Alex
Alex

Reputation: 5646

Comparing chars in Java

I want to check a char variable is one of 21 specific chars, what is the shortest way I can do this?

For example:

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

Doesn't seem to be working. Do I need to write it like:

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

Upvotes: 75

Views: 567459

Answers (13)

You can solve this easily by using the String.indexOf(char) method which returns -1 if the char is not in the String.

String candidates = "ABCDEFGHIJK";
if(candidates.indexOf(symbol) != -1){
    //character in list of candidates
}

Upvotes: 1

Anony
Anony

Reputation: 1

You can just write your chars as Strings and use the equals method.

For Example:

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

Upvotes: 0

Naman
Naman

Reputation: 31888

One way to do it using a List<Character> constructed using overloaded convenience factory methods in is as :

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

Upvotes: 0

Daniel He
Daniel He

Reputation: 357

you can use this:

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

note that you do not need to create a separate String with the letters A-Z.

Upvotes: 7

ColinD
ColinD

Reputation: 110054

Using Guava:

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

Or if many of those characters are a range, such as "A" to "U" but some aren't:

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

You can also declare this as a static final field so the matcher doesn't have to be created each time.

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

Upvotes: 3

lukastymo
lukastymo

Reputation: 26809

If you have specific chars should be:

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           

Upvotes: 3

Marc
Marc

Reputation: 1976

If you know all your 21 characters in advance you can write them all as one String and then check it like this:

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

I think this is the shortest way.

Upvotes: 17

Mark Byers
Mark Byers

Reputation: 838266

If your input is a character and the characters you are checking against are mostly consecutive you could try this:

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

However if your input is a string a more compact approach (but slower) is to use a regular expression with a character class:

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

If you have a character you'll first need to convert it to a string before you can use a regular expression:

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

Upvotes: 87

Richard Miskin
Richard Miskin

Reputation: 1260

It might be clearer written as a switch statement with fall through e.g.

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

Upvotes: 5

Alvin
Alvin

Reputation: 10458

The first statement you have is probably not what you want... 'A'|'B'|'C' is actually doing bitwise operation :)

Your second statement is correct, but you will have 21 ORs.

If the 21 characters are "consecutive" the above solutions is fine.

If not you can pre-compute a hash set of valid characters and do something like

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

Upvotes: 6

rlibby
rlibby

Reputation: 6021

Option 2 will work. You could also use a Set<Character> or

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

Upvotes: 1

tenpn
tenpn

Reputation: 4716

pseudocode as I haven't got a java sdk on me:

Char candidates = new Char[] { 'A', 'B', ... 'G' };

foreach(Char c in candidates)
{
    if (symbol == c) { return true; }
}
return false;

Upvotes: 0

Endophage
Endophage

Reputation: 21473

Yes, you need to write it like your second line. Java doesn't have the python style syntactic sugar of your first line.

Alternatively you could put your valid values into an array and check for the existence of symbol in the array.

Upvotes: 0

Related Questions