web-dev-qa-db-ja.com

Javaの文字の比較

Javaを実行してからしばらく経ちましたので、現時点では私の構文は最高ではありません。

Char変数が21個の特定の文字の1つであることを確認したいのですが、これを行う最短の方法は何ですか?

例えば:

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

動作していないようです。次のように書く必要がありますか?

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

入力が文字であり、チェック対象の文字がほとんど連続している場合、これを試すことができます:

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

ただし、入力が文字列の場合は、文字クラスで正規表現を使用することにより、よりコンパクトなアプローチ(ただし低速)を使用できます。

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

文字がある場合は、正規表現を使用する前に文字列に変換する必要があります。

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

21文字すべてを事前に知っている場合、それらをすべて1つの文字列として記述し、次のようにチェックできます。

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

これが最短の方法だと思います。

11
Marc

あなたが持っている最初のステートメントはおそらくあなたが望むものではありません... 'A'|'B'|'C'は実際にビット単位の操作をしています:)

2番目のステートメントは正しいですが、21個のORがあります。

21文字が「連続」している場合、上記の解決策は問題ありません。

そうでない場合は、有効な文字のハッシュセットを事前に計算して、次のようなことを行うことができます

if (validCharHashSet.contains(symbol))...
6
Alvin

特定の文字がある場合:

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
smas

フォールスルーを伴うswitchステートメントとして書かれた方が明確かもしれません。

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

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
ColinD

オプション2が機能します。 Set<Character>または

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

これを使用できます:

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

a〜Zの文字で個別の文字列を作成する必要がないことに注意してください。

1
Daniel He

Java9 のオーバーロードされた便利なファクトリメソッドを使用して構築されたList<Character>を使用してそれを行う1つの方法は次のとおりです。

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

文字を文字列として記述し、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);
    }
0
Anony

はい、2行目のように書く必要があります。 Javaには、最初の行のpythonスタイルの構文糖衣がありません。

または、有効な値を配列に入れて、配列内のsymbolの存在を確認することもできます。

0
Endophage

私にJava sdkがないので、擬似コード:

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

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