处理一串加减运算的方法

时间:2009-12-19 23:05:53

标签: java operators

我正在编写一个带有一系列加号和减号操作的java方法,例如

“+ 1 + 2 + 3-5”我希望它返回答案的int。

我正尽力做到这一点。我已经尝试了String.split()方法,但它的优点和缺点有点令人困惑。

有人可以帮忙吗?不,这不是家庭作业。

6 个答案:

答案 0 :(得分:3)

嗯,有几件事要考虑......

  • 你可能会使用split来帮助解析,但你需要分隔符以及数字
  • 您可以浏览字符串,记住当前号码的开头位置,然后在找到结束时解析它。
  • 解析后,您将使用哪些数据结构来存储字符串?
    • 您可能需要考虑减去20就像添加-20 ......
    • ...或者您可能想要考虑数字和运算符之间的交替,如果第一个字符不是“ - ”则以隐含的“+”开头
  • 您应该强烈考虑将任务分解为“解析”和“评估”阶段。特别是,即使不编写任何解析代码,您也应该能够为评估阶段编写测试 - 反之亦然。
  • 你说你想尽可能高效地做到这一点 - 为什么?效率通常(但肯定不总是)是清晰的敌人。我至少会尝试寻找一个明确的解决方案首先,然后找出它的效率。通常一个明确的解决方案将“足够有效”。

答案 1 :(得分:2)

这里需要shunting yard algorithm,用Java实现它应该很容易。

答案 2 :(得分:1)

通常有这些类型的问题,您需要一个二叉树。但是,您的情况更简单,您可以使用正则表达式。

Pattern pattern = Pattern.compile("([+-]?)([\\d]+)");
String str = "+10-3+20-10-20";
Matcher m = pattern.matcher(str);
while (m.find()) {
    System.out.println(m.group(1));
    System.out.println(m.group(2));
}

这段代码为您提供了所有符号(group(1))和所有数字(group(2)) 现在,您应该只使用正确的if子句完成while循环。

答案 3 :(得分:0)

您需要逐个字符地解析字符串。像

这样的东西
int foo(String s){  
    int total = 0;
    String currentNum = ""  
    for(int i =0;i<s.length;i++){   
        if(s[i] =="+"){   
           total += Integer.parseInt(currentNum);   
           currentNum = ""   
        }else if(s[i] =="-"){  
           total -= Integer.parseInt(currentNum);  
           currentNum = ""  
        }else{   
           currentNum += s[i]   
        }   
     }     
     return total;
}

答案 4 :(得分:0)

我会先在加号上分开。在您的示例中,您将获得“1”,“2”和“3-5”,然后通过在减号上拆分来处理每个。

答案 5 :(得分:0)

我看到了RHicke的伪代码并且弄乱了它。这是一个适合我的解决方案。虽然他的帖子在正确的轨道上,但它有一些缺失,例如处理最后一个数字以及此代码中显而易见的其他一些事情。

public static int parser(char[] s){  
    int total = 0;
    String currentNum = "";  
    String currentProc = "none";
    for(int i = 0; i < s.length; i++){   
        if(s[i] =='+'){ 
            if(currentProc == "none"){
                total = Integer.parseInt(currentNum);
                currentNum = "";
            }
            else if(currentProc == "plus"){
                total += Integer.parseInt(currentNum);   
                currentNum = "";
            }
            else{
                total -= Integer.parseInt(currentNum);  
               currentNum = "";
            }
            currentProc = "plus";
        }else if(s[i] =='-'){  
            if(currentProc == "none"){
                total = Integer.parseInt(currentNum);
                currentNum = "";
            }
            else if(currentProc == "plus"){
                total += Integer.parseInt(currentNum);   
                currentNum = "";
            }
            else{
                total -= Integer.parseInt(currentNum);  
               currentNum = "";
            }
            currentProc = "minus"; 
        }else{   
           currentNum += s[i];   
        }   
     }
    if(currentProc == "plus"){
        total += Integer.parseInt(currentNum);
    }
    else{
        total -= Integer.parseInt(currentNum);
    }
     return total;
}