Javaを実行してからしばらく経ちましたので、現時点では私の構文は最高ではありません。
Char変数が21個の特定の文字の1つであることを確認したいのですが、これを行う最短の方法は何ですか?
例えば:
if(symbol == ('A'|'B'|'C')){}
動作していないようです。次のように書く必要がありますか?
if(symbol == 'A' || symbol == 'B' etc.)
入力が文字であり、チェック対象の文字がほとんど連続している場合、これを試すことができます:
if ((symbol >= 'A' && symbol <= 'Z') || symbol == '?') {
// ...
}
ただし、入力が文字列の場合は、文字クラスで正規表現を使用することにより、よりコンパクトなアプローチ(ただし低速)を使用できます。
if (symbol.matches("[A-Z?]")) {
// ...
}
文字がある場合は、正規表現を使用する前に文字列に変換する必要があります。
if (Character.toString(symbol).matches("[A-Z?]")) {
// ...
}
21文字すべてを事前に知っている場合、それらをすべて1つの文字列として記述し、次のようにチェックできます。
char wanted = 'x';
String candidates = "abcdefghij...";
boolean hit = candidates.indexOf(wanted) >= 0;
これが最短の方法だと思います。
あなたが持っている最初のステートメントはおそらくあなたが望むものではありません... 'A'|'B'|'C'
は実際にビット単位の操作をしています:)
2番目のステートメントは正しいですが、21個のORがあります。
21文字が「連続」している場合、上記の解決策は問題ありません。
そうでない場合は、有効な文字のハッシュセットを事前に計算して、次のようなことを行うことができます
if (validCharHashSet.contains(symbol))...
特定の文字がある場合:
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
フォールスルーを伴うswitchステートメントとして書かれた方が明確かもしれません。
switch (symbol){
case 'A':
case 'B':
// Do stuff
break;
default:
}
Guava を使用:
if (CharMatcher.anyOf("ABC...").matches(symbol)) { ... }
または、これらの文字の多くが「A」から「U」などの範囲ですが、一部はそうではない場合:
CharMatcher.inRange('A', 'U').or(CharMatcher.anyOf("1379"))
これをstatic final
フィールドとして宣言して、マッチャーを毎回作成する必要がないようにすることもできます。
private static final CharMatcher MATCHER = CharMatcher.anyOf("ABC...");
オプション2が機能します。 Set<Character>
または
char[] myCharSet = new char[] {'A', 'B', 'C', ...};
Arrays.sort(myCharSet);
if (Arrays.binarySearch(myCharSet, symbol) >= 0) { ... }
これを使用できます:
if ("ABCDEFGHIJKLMNOPQRSTUVWXYZ".contains(String.valueOf(yourChar)))
a〜Zの文字で個別の文字列を作成する必要がないことに注意してください。
Java9 のオーバーロードされた便利なファクトリメソッドを使用して構築されたList<Character>
を使用してそれを行う1つの方法は次のとおりです。
if(List.of('A','B','C','D','E').contains(symbol) {
// do something
}
文字を文字列として記述し、equalsメソッドを使用するだけです。
例えば:
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);
}
はい、2行目のように書く必要があります。 Javaには、最初の行のpythonスタイルの構文糖衣がありません。
または、有効な値を配列に入れて、配列内のsymbol
の存在を確認することもできます。
私にJava sdkがないので、擬似コード:
Char candidates = new Char[] { 'A', 'B', ... 'G' };
foreach(Char c in candidates)
{
if (symbol == c) { return true; }
}
return false;