1

これをどうやって攻撃するのかわからない。

基本的に私が持っているのは、アクションを引き起こすさまざまな長さの入力を1回または複数回入力することです。入力された入力、ファイルなどからのものです。

何をどうやって取り組むのかわからない。、、、、または他の方法にint対応するを返す関数を持つのが最善でしょうか?public static final int FOO = 1;enum

私が今持っているのは、次のような一連のifステートメントです。

if (str.equals("foo") || str.equals("F")) {
      blah;
} else if (str.equals("beach")) {
      more blah;
}

これは良いですか、それとももっと良い方法がありますか?覗き見しenumたことがありますが、たとえばCの場合はそれ以上のようです。これはおそらく間違っていますが、これに向けた何かでしょうか。

class Mother
{

    HappyCamping() {
        switch (ValInput(str)) {
        case FOO: do fo; break;
        case BAR: do bar; break;
        case BAZ: do fo bar: break
        ...
    }

    private enum ValInput(String str)
    {
         FOO("foo"), BAR("bar"), BAZ("baz");

         private int value;

         private ValInput(String str) {
              if (str.equals("blah"))
                   this.value = 1;
              ...
         }
    }
}

よりクリーンなアプローチを採用し、「解析」をメインルーチンから分離することをポイントします。ここで良い方法は何でしょうか?

4

5 に答える 5

1

これは良いですか、それとももっと良い方法がありますか?列挙型をのぞき見したことがありますが、それはたとえばCの場合よりも多いようです。これはおそらく間違っていますが、これに向けた何かでしょうか。

次に、列挙型がどのように機能するかを学びに行きます。より多くの機能があるという理由だけで問題を解決する可能性のある機能を避けないでください。固定のアクションセットが必要な場合は、設計でJavaスタイルの列挙型を使用する可能性があります。

enum Action { CLICK("click"), CLEAR("erase"); } 

などは良いスタートです。

Java(6以降、おそらく7)もswitch、整数値または列挙値の代わりに文字列を取得することをサポートしています。

于 2013-03-15T18:55:42.293 に答える
1

問題全体を理解できるかどうかはわかりませんが、Javaで文字列を列挙型に簡単に変換できます。

エントリ文字列が制限され、事前定義されており、を使用して列挙型として解析する場合

EnumType.valueOf("foo")

Java列挙型を読むことをお勧めします。Java列挙型はC列挙型に比べて非常に強力です。

于 2013-03-15T18:56:16.330 に答える
1

StringJava 7では、式で使用できますswitchこの記事を参照してください:

switch (str) {
  case "blah":
    // some action
    break;
  case "beach":
    // another blah
    break;
  default:
    // default action
    break;
}
于 2013-03-15T18:56:55.863 に答える
1

ifステートメントは、この問題に取り組むための最も論理的な方法のようです。あなたの人生を複雑にする必要はありません、ただそれを単純にしてください。他の方法には、トレードオフと複雑さがあります。


ここに示すように、マップとコマンドパターンの使用を検討してください。キーワードを機能にマップするすべてを非表示にすることができ、ifまたはを使用する必要はありませんswitch

于 2013-03-15T19:02:39.913 に答える
1

1つのアプローチは、トークンを返すパーサーを作成することです。トークンは、intまたはEnumで表すことができます。それはあなたが望む方法であなたのコードをモジュール化します。

もう1つの方法は、列挙型を使用することです。

public enum Token {

   FOO("foo", "f"),
   BAR("bar", "b");

   private String keyword;
   private String abbreviation;

   private Token(String keyword, String abbreviation) {
       this.keyword = keyword;
       this.abbreviation = abbreviation;
   }

   public String getKeyword() { 
       return this.keyword; 
   }
   public String getAbbreviation() { 
       return this.abbreviation;
   }

   public static Token valueOf(String s) {
       for (Token token : values()) {
           if (token.getKeyword().equals(s) || token.getAbbreviation().equals(s)) {
               return token;
           }
       }
       throw new IllegalArgumentException("No such keyword:  " + s);
   }
}

次に、次のようなことを行うことができます。

switch (Token.valueOf(inputString)) {
    case BAR : doBarStuff(); return;
    case FOO : doFooStuff(); return;
}
于 2013-03-15T19:02:57.290 に答える