2016-09-26 77 views
-1

我想將作爲字符串給出的表達式轉換爲整數。例如。如果給出「1 + 5 * 5」,該方法應返回「26」。我開始只爲解決乘法寫代碼,但是,當我運行它沒有一個輸出字符串到整數表達式

public static void operationS(ArrayList<String> m) 
{ 
    for (int i=0; i<m.size(); i++) 
    { 
     while ((m.get(i)).contains("*")) 
     { 
      int x = ((m.get(i)).indexOf("*")); 
      char A=((m.get(i)).charAt(x-1)); 
      char B= ((m.get(i)).charAt(x+1)); 

      int r= Character.getNumericValue(A)*Character.getNumericValue(B); 

      String numberAsString = Integer.toString(r); 

      if(x==1 && (m.get(i)).length()==3) 
      { 
       m.set(i, numberAsString); 

      } 

      if(x==1 && (m.get(i)).length()>3) 
      { 
      String n = numberAsString+((m.get(i)).substring(x+2)); 
      m.set(i, n); 

      } 

      else 
      { 
       String k= ((m.get(i)).substring(0,x-1))+numberAsString+((m.get(i)).substring(x+2)); 
      } 

      } 
     } 
    for (int u=0;u<m.size();u++) 
      { 
      System.out.println (m.get(u)); 
      } 
    } 

因爲我無法導入任何圖書館,我的行動計劃是每完成一個工作時間替換字符串。

我打算使用相同的循環進行增加,減少和除法

+0

我敢肯定你今天早些時候發佈了一個確切的重複......請不要轉貼完全相同的問題,它氣餒,非常皺眉。 – Li357

+0

你好嗎? – immibis

+0

請對錶達式解析做一些研究。基本上,您需要從左到右瀏覽字符串,查找表達式中的數字和運算符_lexemes_,並在他們出現時與他們一起工作。尋找操作員並試圖找到旁邊的數字很可能會導致悲傷,當你最終以錯誤的順序進行操作時。 – ajb

回答

0

考慮解析表達式。您可以使用前綴,中綴或後綴表示法和解析來評估輸入表達式。

我讀到一篇文章,可以幫助您瞭解如何實現這一點:要解決這個問題,不同的方法

http://www.sunshine2k.de/coding/java/SimpleParser/SimpleParser.html

本文主要會談。

我個人喜歡遞歸方法。所以如果你理解遞歸,你可以選擇。

但是,如果你有一個要求只使用一個循環,你可能更喜歡其他方法之一。

更新:添加基於上面鏈接製品的實施遞歸碼的樣品片。

static final char[] ops = { '-', '+', '*', '/'}; 

    static double evaluate(String s){ 
     for(char op: ops) { 
      if(s.contains(String.valueOf(op))){ 
       String op1 = s.substring(0, s.indexOf(op)); 
       String op2 = s.substring(s.indexOf(op) + 1, s.length()); 
       switch(op) { 
        case '-': return evaluate(op1) - evaluate(op2); 
        case '+': return evaluate(op1) + evaluate(op2); 
        case '*': return evaluate(op1) * evaluate(op2); 
        case '/': return evaluate(op1)/evaluate(op2); 
       } 
      } 
     } 
     /* at this point there is no operator in the term anymore, just a number */ 
     return (convertToDouble(s)); 
    } 

    private static double convertToDouble(String s) { 
     return Double.parseDouble(s); 
    } 
0

試試這個。

static String replaceAll(CharSequence cseq, String regex, Function<MatchResult, String> replacement) { 
    Matcher matcher = Pattern.compile(regex).matcher(cseq); 
    StringBuffer sb = new StringBuffer(); 
    while (matcher.find()) { 
     String replaced = replacement.apply(matcher.toMatchResult()); 
     matcher.appendReplacement(sb, Matcher.quoteReplacement(replaced)); 
    } 
    matcher.appendTail(sb); 
    return sb.toString(); 
} 

static int toInt(String s) { 
    return Integer.parseInt(s); 
} 

而且

String input = "1 + 5 * 5"; 
String output = input; 
while (true) { 
    String r = replaceAll(output, "(\\d+)\\s*\\*\\s*(\\d+)", 
     m -> "" + (toInt(m.group(1)) * toInt(m.group(2)))); 
    if (r.equals(output)) break; 
    output = r; 
} 
while (true) { 
    String r = replaceAll(output, "(\\d+)\\s*\\+\\s*(\\d+)", 
     m -> "" + (toInt(m.group(1)) + toInt(m.group(2)))); 
    if (r.equals(output)) break; 
    output = r; 
} 
System.out.println(input + " -> " + output); 

結果:

1 + 5 * 5 -> 26