Porównywanie znaków w Javie

Minęło trochę czasu, odkąd robiłem Javę, więc moja składnia nie jest najlepsza w tej chwili.

Chcę sprawdzić, czy zmienna char jest jednym z 21 specyficznych znaków, jaki jest najkrótszy sposób, w jaki mogę to zrobić?

Na przykład:

if(symbol == ('A'|'B'|'C')){}
Wygląda na to, że nie działa. Czy muszę pisać tak:
if(symbol == 'A' || symbol == 'B' etc.)
Author: royhowie, 2011-02-17

12 answers

Jeśli Twoje dane wejściowe są znakami, a znaki, które sprawdzasz, są w większości następujące po sobie, możesz spróbować tego:

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

Jeśli jednak Dane wejściowe są ciągiem znaków, bardziej zwartym podejściem (ale wolniejszym) jest użycie wyrażenia regularnego z klasą znaków:

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

Jeśli masz znak, musisz najpierw przekonwertować go na ciąg znaków, zanim będziesz mógł użyć wyrażenia regularnego:

if (Character.toString(symbol).matches("[A-Z?]")) {
    // ...
}
 62
Author: Mark Byers,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-17 21:07:23

Jeśli znasz wszystkie swoje 21 znaków z góry, możesz zapisać je wszystkie jako jeden ciąg znaków, a następnie sprawdzić to tak:

char wanted = 'x';
String candidates = "abcdefghij...";
boolean hit = candidates.indexOf(wanted) >= 0;
Myślę, że to najkrótsza droga.
 10
Author: Marc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-17 21:15:19

Pierwsze stwierdzenie, które masz, prawdopodobnie nie jest tym, czego chcesz... 'A'|'B'|'C' faktycznie wykonuje operacje bitowe:)

Twoja druga wypowiedź jest poprawna, ale będziesz miał 21 or.

Jeśli 21 znaków jest "kolejne" powyższe rozwiązania są w porządku.

Jeśli nie, możesz wstępnie obliczyć zestaw prawidłowych znaków i zrobić coś w stylu

if (validCharHashSet.contains(symbol))...
 5
Author: Alvin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-17 21:03:40

Może być jaśniej napisane jako polecenie switch z fall through np.

switch (symbol){
    case 'A':
    case 'B':
      // Do stuff
      break;
     default:
}
 3
Author: Richard Miskin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-17 21:05:42

Jeśli masz określone znaki powinny być:

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           
 3
Author: smas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-17 21:16:22

Użycie Guawa :

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

Lub jeśli wiele z tych znaków jest przedziału, np. " A "do" U", ale niektóre nie:

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

Możesz również zadeklarować to jako pole static final, aby matcher nie musiał być tworzony za każdym razem.

private static final CharMatcher MATCHER = CharMatcher.anyOf("ABC...");
 2
Author: ColinD,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-17 21:21:53

Opcja 2 zadziała. Możesz również użyć Set<Character> lub

char[] myCharSet = new char[] {'A', 'B', 'C', ...};
Arrays.sort(myCharSet);
if (Arrays.binarySearch(myCharSet, symbol) >= 0) { ... }
 1
Author: rlibby,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-17 21:03:26

Możesz użyć tego:

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

Zauważ, że nie musisz tworzyć oddzielnego ciągu znaków z literami A-Z.

 1
Author: Daniel He,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-16 04:02:01

Tak, musisz to napisać jak w drugiej linijce. Java nie ma cukru składniowego w stylu Pythona z pierwszej linii.

Alternatywnie możesz umieścić swoje prawidłowe wartości w tablicy i sprawdzić istnienie symbol w tablicy.

 0
Author: Endophage,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-17 21:01:50

Pseudokody jak nie mam przy sobie sdk Javy:

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

foreach(Char c in candidates)
{
    if (symbol == c) { return true; }
}
return false;
 0
Author: tenpn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-17 21:03:04

Możesz po prostu zapisać swoje znaki jako ciągi znaków i użyć metody equals.

Na Przykład:

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);
    }
 0
Author: Anony,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-16 21:59:11

Jednym ze sposobów, aby to zrobić przy użyciu List<Character> skonstruowanych przy użyciu przeciążonych metod fabryki wygody w java9 jest:

if(List.of('A','B','C','D','E').contains(symbol) {
    // do something
}
 0
Author: nullpointer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-28 19:40:32