2012-04-29 6 views
0

何をしているのかは、有限アルファベットの文字列文字配列にコピーし、文字に応じた関数を呼び出すif文を実行します。Java - if文にパラメータを渡す方法 "F(x)"が見つかった場合は、F関数に "x"を渡してください

functionL、functionF、functionF、functionOpenB、functionF、functionCloseBを呼び出すlff [f]など

だから、現在、その:

workRuleArr= stringProdrule.toCharArray(); 
for (char c=0; c < workRuleArr.length; c++){ 
    if (workRuleArr[c] == 'f') 
    { 
      functionF(); 

     } 
     if (workRuleArr[c] == 'l') 
    { 
      functionL(); 

     } 

など

これは、罰金やしかし、働いている:それはfunctionLを呼び出すなるように

は、どのように私はそのような「L(100)FF ..」として制作ルールからそれらの関数にパラメータを渡す(x)の..ここで、xは100で、関数100には100を渡します。

xには、同じプロダクションルール文字列内にさまざまな値が存在することがあります。ユーザーはプログラムの開始時に一度にルールを入力するので、同じプロダクションルールで複数のパラメータを処理する必要があります

質問が不明な場合は、私に教えてください。おかげ

+0

ああ、そして私の答えのほか、一般的なヒント:代わりに==の等号(..)を使用します。 –

+0

カウンターの型として 'char'を使用しないでください。 'int'を使います。 –

答えて

0

がパラメータであるかどうかをテストする場合は、簡単な文を試してみてください。

workRuleArr= stringProdrule.toCharArray(); 

for (char c=0; c < workRuleArr.length; c++){ 

    if (workRuleArr[c] == 'f') { 

     if(workRuleArr[c+1].equals("(")) { 

      // use the parameter 
      String param = ""; 

      c++; 

      while(!workRuleArr[c+1].equals(")")) { 
       param += workRuleArr[c+1]; 
       c++; 
      } 

      int yourParameter = Integer.parseInt(param); 

      functionF(yourParameter); 
     } 
     else { 

      functionF(); 
     } 
    } 
    if (workRuleArr[c] == 'l'){ 

     functionL(); 
    } 
} 

注意してください、私は、コードをテストしていませんが、多少の誤差があることができます。

+0

それはかなりダメ良い仲間に見えます、ありがとう、今それを試してみるつもりです。 – WeylandYutani

4

は、これらの「ルール関数は、」あなたはすべてが同様の目的を果たす持っているので、彼らは同じインタフェースに従う、

よう
interface Rule{ 
    void executeRule(); 
} 

次にあなたが

のようなそのインターフェイスを実装する別のルールを持っているように私には思えます
class RuleF implements Rule{ 
     void executeRule(){ 
      //execute rule F 
     } 
} 

class RuleL implements Rule{ 
     void executeRule(){ 
      //execute rule L 
     } 
} 

次に、文字を特定のルールに関連付ける簡単な方法が必要です。あなたもよ

それと
Map<Character, Rule> ruleMap = new HashMap<Character, Rule>(); 
ruleMap.add('f', new RuleF()); 
ruleMap.add('l', new RuleL()); 

あなたは今、あなたはルールのインターフェースがパラメータを受け取ることが必要な場合

workRuleArr= stringProdrule.toCharArray(); 
for (char c=0; c < workRuleArr.length; c++){ 
    Rule rule = ruleMap.get(workRuleArr[c]); 
    rule.executeRule(); 
} 

のようにすべてのものを「IFS」を、削除することができ、 : は、HashMapを使用し、同様に渡す必要のあるパラメータに文字を関連付けるために、同様のMapオブジェクトが必要です。

あなたは正確に何を構築していますか?何らかの状態機械?

乾杯、幸運! :-)

0

文字列には、この場合でも便利なメソッドがありますので、私はchar配列に変換しません。

ので、インデックスiと各文字のためにあなたはi+1でcharは「(」。その後に続け、その後、閉じ括弧を取得し、関数のパラメータとして両方の括弧の間の文字列を渡すためにint k = stringProdrule.indexOf(')', i+2)を使用しているかどうかをテストする必要がありますk+1

1

Command Patternをご覧ください。基本的には、この質問は、あなたに有効なトークンを与えるか、またはジェリーリグあなた自身の必要がありますいくつかの並べ替えのパーサーが必要なように見える

1

の答えを求めています。どのような場合でも、アレイの一歩先を見なければなりません。ここ は、さらに別の実装です:

String rule = "FLL(123)FKF"; 

String pattern = "[a-zA-Z]{1}|[(\\d)]+"; //any single character or set of (numbers) 
Pattern p = Pattern.compile(pattern); 
Matcher m = p.matcher(rule); 

String command = "", param = "", token; 

while(m.find()){ 
    token = m.group(); 

    if(token.length() > 1){ //must be parameter 
    param = token.substring(1, token.length()-1); 
    continue; 
    } 

    if(command != ""){ 
    runCommand(command, param); 
    param = ""; //clear 
    } 
    command = token; //set next 
} 

if(command != "") //last trailing run 
    runCommand(command, param); 

もrunCommand関数を定義する必要があります。

bool runCommand(string command, string param){ 
    System.out.println("execute function" + command + "(" + param + ")"); 

    bool success, hasParam = (param != ""); 
    int p = Integer.parseInt(param); 

    switch(command){ 
    case "F": 
     success = (hasParam ? functionF() : functionF(p)); 
     break; 
    case "L": 
     success = (hasParam ? functionL() : functionL(p)); 
     break; 
    case "K": 
     success = (hasParam ? functionK() : functionK(p)); 
     break; 
    } 
    return success; 
} 
関連する問題