2012-04-29 64 views
0

即時操作是以有限字母表的字符串形式製作生產規則,將其複製到一個字符數組,然後運行它通過根據字符的功能,其調用一個if語句。Java - 如何將參數傳遞給if語句「如果找到」F(x)「,則將」x「傳遞給F函數

如「LFF並[f]」,呼籲腦功能,函數f,函數f,functionOpenB,函數f,functionCloseB。

所以目前其:

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

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

     } 

這是精細和工作然而,:

如何將參數傳遞到從生產規則的那些功能,例如「L(100)FF ..」,因此,這將調用腦功能(X).. 。其中x = 100,並將100傳遞給函數??

並且在同一生產規則字符串中x可能有許多不同的值。用戶在程序開始時一次性輸入規則,因此需要在同一生產規則中處理多個參數。

如果問題不清楚,請告訴我們任何想法。由於

+0

哦,再說我的回答一般提示:使用等於(..)而不是==。 –

+0

不要使用'char'作爲計數器的類型。使用'int'。 –

回答

0

嘗試一個簡單的if語句來測試是否有一個參數或不:

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

然後,您需要一種簡單的方法將角色與給定的規則相關聯。 使用HashMap,如:

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

現在,如果你需要的是規則接口接收參數, 你也需要一個類似的Map對象來將角色與你需要傳遞的參數相關聯。

你究竟在做什麼?某種狀態機?

歡呼聲,祝你好運! :-)

0

我不會轉換成char數組,因爲String有更多和有用的方法,對於這種情況也是如此。

因此,對於指數i每個字符,你需要測試,如果在i+1的字符是「(」,然後使用int k = stringProdrule.indexOf(')', i+2)獲得右括號,並通過兩個括號之間的字符串作爲參數傳遞給函數,然後繼續在k+1

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; 
} 
相關問題