2012-06-14 11 views
5

私のアプリでは、入力がいくつかの特定の20のエントリと一致する場合、私は分岐する必要があります。複雑なif()またはenum?

私が列挙

public enum dateRule { is_on, is_not_on, is_before,...} 

と機能に

switch(dateRule.valueOf(input)) 
{ 
    case is_on : 
    case is_not_on : 
    case is_before : 
    . 
    . 
    . 
    // function() 
    break; 
} 

を行うにはenum定数のスイッチを使用するのではと思った。しかし「である」のような入力文字列がなる、「ではありません単語の間に_がないなどの前にあります。 enumには空白を含む定数がありません。

可能な方法私は作ることができます:

1を使用して文が挿入するための入力に長いif文

if(input.equals("is on") || 
    input.equals("is not on") || 
    input.equals("is before") ...) { // function() } 

2、のような仕事を与えて20の可能な入力を比較する場合_単語の間この20の下にない他の入力文字列であっても、複数の単語を持つことができます。

これを実装するより良い方法はありますか?あなたは、Java 7を使用している場合、あなたはまた、ここで真ん中の道を選択し、文字列でswitchステートメントを行うことができます

+0

Java 7では、文字列をオンにすることができます。 –

答えて

0

ありがとうございます。彼らは私をここに案内した。

これは他の回答とほとんど同じですが、ちょっと単純です。要約する

、私は彼らが一致した場合に20の文字列と

のセットで、入力文字列を比較する必要がある、何かをします。そうでなければ、何かをしてください。

比較する必要があるため、入力文字列の静的セット: は、上にあるではない、前である、後にある、など20のエントリ

Iは列挙

public enum dateRules 
{ 
    is_on 
    ,is_not_on 
    ,is_before 
    ,is_after 
    . 
    . 
    . 
} 

スイッチングを作成入力

if(isARule(in = input.replace(" ","_")) 
{ 
    switch(dateRule.valueOf(in)) 
    { 
     case is_on, 
     case is_not_on, 
     case is_before, ... 
    } 
} 

のフォーマットされた値に私は別せずに入力を再利用することができるように 'と「_」で置き換える「内」に「入力」の書式設定された値をコピーします。

private static boolean isARule(String value) 
    { 
    for(dateRule rule : dateRule.values()) 
    { 
     if(rule.toString().equals(value)) 
     { 
     return true; 
     } 
    } 
    return false; 
    } 

問題を解決しました。

参考:https://stackoverflow.com/a/4936895/1297564

1

switch (input) { 
    case "is on": 
     // do stuff 
     break; 
    case "is not on": 
     // etc 
} 
+3

、Java 7+のみ –

+0

ありがとうございます。将来私はいつか確実に助けてくれるでしょう。 :) – aradhak

0

あなたは本当にアップに十分な概念を壊していない、両方のソリューションがあります脆い...あなたの構文で

ルック

は、 "ある" 削除することができ、ユビキタス

"ない" のようです、オプション、適用されます!出力比較へ

オン、前、後、比較を適用する。

スペース間を分割します。分割された単語を解析して構文定義に存在することを確認し、渡された式を段階的に評価します。これにより、簡単に構文を拡張することができます( "is"と "not" 「読みやすいコードを保つ組み合わせごとにと。

をswitch文の目的のために一つにマングド複数の条件を持つ時間をかけて巨大な肥大化につながる。値から列挙型識別子を区切ることが可能である

3

。このようなもの:

public enum MyEnumType 
{ 
    IS_BEFORE("is before"), 
    IS_ON("is on"), 
    IS_NOT_ON("is not on") 

    public final String value; 

    MyEnumType(final String value) 
    { 
     this.value = value; 
    } 
} 

また、メソッドをenum-typeに追加することもできます(メソッドにはargumエントとしても)、このような何か:

public boolean isOnOrNotOn() 
{ 
    return (this.value.contentEquals(IS_ON) || this.value.contentEquals(IS_NOT_ON)); 
} 

スイッチでの使用:

switch(dateRule.valueOf(input)) 
{ 
    case IS_ON: ... 
    case IS_NOT_ON: ... 
    case IS_BEFORE: ... 
} 

そして、あなたは一例System.out.println(IS_ON)のためのようIS_ONの値を取得するとき、それはis onが表示されます。

+0

dateRuleの 'dateRule()を(java.lang.String)'に適用できません。 IDEの提案は、コンストラクタを定義することです。 – aradhak

+0

@Studentそれも私の提案です:)申し訳ありません、私は部分的なコードを投稿しただけです。私はもう少し追加しました。 –

+0

ありがとう!これ以上エラーはありません。 :)しかし、私は 'System.out.println(is_on);でis_onを取得します; – aradhak

3

valueOfメソッドを列挙型の中に定義することができます(ただvalueOfと呼ばないでください)。

public enum State { 
    IS_ON, 
    IS_OFF; 

    public static State translate(String value) { 
     return valueOf(value.toUpperCase().replace(' ', '_')); 
    } 
} 

以前のようにそのまま使用してください。

State state = State.translate("is on"); 

以前のswitch文は引き続き動作します。

+0

ここから開始し、制御フローをさらに簡素化することで、私が投稿したソリューションに終わりました。たくさん学んだ。ありがとう。 :) – aradhak