5

私のアプリでは、入力が特定の20エントリと一致する場合に分岐する必要があります。

列挙型を使用することを考えました

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;
}

ただし、入力文字列は、単語間に_がない場合、「オン」、「オンではない」、「前」などのようになります。列挙型はスペースを含む定数を持つことができないことを学びました。

私が理解できる可能性のある方法:

1、ifステートメントを使用して、次のような長いifステートメントを与える20の可能な入力を比較します。

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

2、入力で作業して単語の間に_を挿入しますが、この20に該当しない他の入力文字列でも複数の単語を含めることができます。

これを実装するためのより良い方法はありますか?

4

5 に答える 5

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にメソッドを追加することもできます(メソッドは引数を持つこともできます)。

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: ...
}

たとえば、IS_ONの値を取得すると、System.out.println(IS_ON)が表示されis onます。

于 2012-06-14T11:43:55.433 に答える
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ステートメントは引き続き機能します。

于 2012-06-14T11:44:52.750 に答える
1

Java 7を使用している場合は、ここで中間の道を選択し、switch文字列を使用してステートメントを実行することもできます。

switch (input) {
    case "is on":
        // do stuff
        break;
    case "is not on":
        // etc
}
于 2012-06-14T11:42:08.460 に答える
0

提案をありがとう。彼らは私をここに案内してくれました。

これは他の回答とほとんど同じですが、少し単純化されています。

要約すると、入力文字列を20個の文字列のセットと比較する必要があります。

それらが一致する場合は、何かを行います。そうでなければ、何か他のことをしてください。

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

列挙型を作成しました

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, ...
   }
}

'_'を''に置き換えることなく入力を再利用できるように、'input'のフォーマットされた値を'in'にコピーしました。

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

于 2012-06-15T05:53:54.673 に答える
0

あなたは本当に概念を十分に分割していません、両方の解決策はもろいです...

構文を見てください

「は」、削除でき、どこにでもあるようです

「not」、オプション、!を適用します 出力比較に

on、before、after、比較を適用します。

したがって、スペース間で分割します。分割された単語を解析して構文定義に存在することを確認してから、渡された式を段階的に評価します。これにより、構文を簡単に拡張できます(「is」と「isnot」を追加する必要はありません)。 "組み合わせごとに、コードを読みやすくします。

switchステートメントの目的で複数の条件を1つに変更すると、時間の経過とともに大幅な肥大化が発生します。

于 2012-06-14T11:42:32.267 に答える