2011-09-30 10 views
36

素朴な疑問が、Googleは多くを支援していません。形式の複数の「または」における条件文の(Java)の場合に最良の方法

私が代わりのようなものを書くの多くの条件付きif文(それらのいずれかが存在しているかどうかを確認するために10のまたは15の定数をチェックする必要があります。)

を持っている:

if (x == 12 || x == 16 || x == 19 || ...) 

がありますこれをコーディングする簡単な方法があるかどうかだけで不思議

if x is [12, 16, 19]? 

ようにそれをフォーマットする方法、任意のヘルプは大歓迎しました。

編集:答えは非常に参考にされているが、私は、私は彼らの好奇心をあかすためにそれを行いますので、少数の人々によってより詳細な情報を追加するように頼まれました。

:私は唯一の30日間(4があり、そのうちの私は思う)を持っヶ月で> 30なかったと陳述場合、私はこのようなことを確認するために書いていたことを確認日間行うのに必要な日付の検証クラスを作っていました答えの多くは下記:)助けた - そのようなことをコーディングするより高速な方法があった場合
if (day > 30 && (month == 4 || month == 6 || month == 9 || month == 11)) 

私は思っていました。

+0

あなたがしようとしていることのより良い例を挙げることはできますか?おそらく解決策はそれを考えることにあるのでしょうか? –

答えて

37

私はこの種のパターンを頻繁に使います。それは非常にコンパクトです:

// Define a constant in your class. Use a HashSet for performance 
private static final Set<Integer> values = new HashSet<Integer>(Arrays.asList(12, 16, 19)); 

// In your method: 
if (values.contains(x)) { 
    ... 
} 

HashSetが良いルックアップの性能を与えるために、ここで使用されている - にも非常に大きなハッシュセットは非常に迅速を実行することができます。

パフォーマンスが重要でない場合は、1行にそれの要点をコーディングすることができます

if (Arrays.asList(12, 16, 19).contains(x)) 

が、それはそれが実行される新しいArrayListたびに作成することを知っています。

+2

if(Arrays.asList(12,16,19).contains(x )) –

+0

ブライアン、私はあなたの提案をパフォーマンス上の警告で追加しました – Bohemian

+1

これは 'List'よりむしろ' Set'を使用したいと思いますが、それは実際にその少数の要素には何の影響も与えません。 –

3

あなたはマップキーの存在を探したり、それがセットでいた場合見ることができました。

あなたがをやって、実際にしている内容に応じて、しかし、あなたは問題の間違ったを解決しようとしている可能性があります:)

3

いくつかの並べ替えのコレクションを使用する - これは、コードを読みやすくし、すべて離れて非表示になりますそれらの定数。簡単な方法は、リストで次のようになります。

// Declared with constants 
private static List<Integer> myConstants = new ArrayList<Integer>(){{ 
    add(12); 
    add(16); 
    add(19); 
}}; 

// Wherever you are checking for presence of the constant 
if(myConstants.contains(x)){ 
    // ETC 
} 

それが複数の場所でアクセス可能ですので、定数のリストうちボヘミアンポイントが静的であるように。

興味がある人々のために、私の例では、リストにはdouble brace initializationを使用しています。私は最近それに遭遇して以来、私は素早く&ダーティーリストの初期化を書いていいと思った。

+1

または 'if(Arrays.asList(new int [] {12,16,19})。contains(x)){...}' –

+0

@Bala確かに!いずれの場合でも、リストはここで使用するコレクションの単なる例です。他の答えの1つとして、定数がユニークであることを保証するためにセットがより良いかもしれない...または検索を高速化するハッシュテーブルなど –

10

これに切り替えますか?

switch(x) { 
    case 12: 
    case 16: 
    case 19: 
     //Do something 
     break; 
    default: 
     //Do nothing or something else.. 
     break; 
} 
3

可能性のセットが「コンパクト」(つまり、最大値 - 最小値が200未満)の場合は、ルックアップテーブルを検討するとよいでしょう。あなたは(上の例では1、2、3)

取るべき枝を特定の値を持つ配列を設定
if (x == 12 || x == 16 || x == 19 || ...) 
else if (x==34 || x == 55 || ...) 
else if (...) 

のような構造を持っていた場合、これは特に有用であろうと、あなたのテストが

switch(dispatchTable[x]) 
{ 
    case 1: 
     ... 
     break; 
    case 2: 
     ... 
     break; 
    case 3: 
     ... 
     break; 
} 
になります

これが適切かどうかは、問題のセマンティクスによって異なります。

配列が適切でない場合はMap<Integer,Integer>を使用するか、単一のステートメントのメンバーシップをテストするだけの場合はSet<Integer>となります。しかし、それは単純なif声明のための多くの火力ですが、より多くの文脈がなければ、正しい方向にあなたを導くことは困難です。

4

いいえ、あなたはJavaでそれを行うことはできません。次のようにあなたはしかし、メソッドを書くことができます:

boolean isContains(int i, int ... numbers) { 
    // code to check if i is one of the numbers 
    for (int n : numbers) { 
     if (i == n) return true; 
    } 
    return false; 
} 
2

のJava 8を使用すると、プリミティブストリーム使用することができます数に応じて、

if (IntStream.of(12, 16, 19).anyMatch(i -> i == x)) 

が、これはわずかなオーバーヘッド(またはしない)を有することができるが比較の

関連する問題