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.)
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?]")) {
// ...
}
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.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:)
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))...
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:
}
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
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...");
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) { ... }
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.
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.
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;
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);
}
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
}
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