Java 处理一系列加减运算的方法

Java 处理一系列加减运算的方法,java,operators,Java,Operators,我正在编写一个java方法,它接受一系列加减运算,例如 “+1+2+3-5”,我希望它返回答案的整数 我正在尽可能有效地做这件事。我尝试了String.split()方法,但它会稍微混淆加号和减号 有人能帮忙吗?不,这不是家庭作业。您需要逐个字符解析字符串。差不多 int foo(String s){ int total = 0; String currentNum = "" for(int i =0;i<s.length;i++){

我正在编写一个java方法,它接受一系列加减运算,例如

“+1+2+3-5”,我希望它返回答案的整数

我正在尽可能有效地做这件事。我尝试了
String.split()
方法,但它会稍微混淆加号和减号


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

您需要逐个字符解析字符串。差不多

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;
}
intfoo(字符串s){
int-total=0;
字符串currentNum=“”

对于(inti=0;i您需要逐个字符解析字符串

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;
}
intfoo(字符串s){
int-total=0;
字符串currentNum=“”

对于(inti=0;i嗯,有几件事需要考虑

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

    • 好吧,有几件事需要考虑

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

      这是您在这里需要的,在Java中应该很容易实现。

      这是您在这里需要的,在Java中应该很容易实现。

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

      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));
      }
      
      这段代码为您提供了所有符号(
      组(1)
      )和所有数字(
      组(2)

      现在,您应该只使用适当的if子句来完成while循环。

      通常,对于这些类型的问题,您需要一个二叉树。但是,您的情况更简单,并且可以使用regex

      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));
      }
      
      这段代码为您提供了所有符号(
      组(1)
      )和所有数字(
      组(2)

      现在,您应该只使用适当的if子句来完成while循环。

      我将首先在加号上拆分。在您的示例中,您将得到“1”、“2”和“3-5”,然后通过在减号上拆分来处理它们。

      我将首先在加号上拆分。在您的示例中,您将得到“1”、“2”和“3-5”然后通过在减号上拆分来处理每一个问题。

      我看到了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;
      }
      
      publicstaticint解析器(char[]s){
      int-total=0;
      字符串currentNum=“”;
      字符串currentProc=“无”;
      对于(int i=0;i
      我看到了RHicke的psuedocode,然后把它弄得乱七八糟。这里有一个非常适合我的解决方案。虽然他的帖子在正确的轨道上,但它有一个