【问题标题】:How to make program to calculate accordingly to Order of operations in math? (Java) [duplicate]如何使程序根据数学运算顺序进行计算? (Java)[重复]
【发布时间】:2016-04-26 14:02:52
【问题描述】:

我正在尝试用 Java 编写一个程序,它需要输入一个字符串值 像 s = "1+27-63*5/3+2" 并返回整数值的计算

下面是我的代码

package numberofcharacters;
import java.util.ArrayList;
public class App {
    public static void main(String[] args) {
        String toCalculate = "123+98-79÷2*5";
        int operator_count = 0;  
        ArrayList<Character> operators = new ArrayList<>();
        for (int i=0; i < toCalculate.length(); i++){
             if (toCalculate.charAt(i) == '+' || toCalculate.charAt(i) == '-' ||
                 toCalculate.charAt(i) == '*' || toCalculate.charAt(i) == '÷' ) {
             operator_count++;  /*Calculating
                                  number of operators in a String toCalculate
                                */
             operators.add(toCalculate.charAt(i)); /* Adding that operator to 
                                                    ArrayList*/
         }
     }
     System.out.println("");
     System.out.println("Return Value :" );

     String[] retval = toCalculate.split("\\+|\\-|\\*|\\÷", operator_count + 1);    

    int num1 = Integer.parseInt(retval[0]);
    int num2 = 0;
    int j = 0;
    for (int i = 1; i < retval.length; i++) {

        num2 = Integer.parseInt(retval[i]);
        char operator = operators.get(j);
        if (operator == '+') {
            num1 = num1 + num2;

        }else if(operator == '-'){
            num1 = num1 - num2;
        }else if(operator == '÷'){
            num1 = num1 / num2;
        }else{
            num1 = num1 * num2;
        }
        j++;            
    }
    System.out.println(num1);   // Prints the result value
    }

}

****问题是我需要根据数学中的运算顺序进行计算,例如先乘除法,而不是加法和减法。 我该如何解决这个问题? ****

我已经使用 String split() 方法在出现运算符“+-/*”的地方分隔字符串。我已经使用字符 ArrayList 在其中添加运算符。 与代码的最后一部分相比,我在那个 拆分的字符串数组 中循环,并且通过将字符串拆分数组的第一个值解析为整数来初始化 int num1。和 int num2 与第二个值和使用运算符 arraylist 在它们之间执行计算(无论是 arraylist 索引处的运算符)。并将结果存储在 int num1 中,反之亦然,直到字符串数组的末尾。

[P.S] 我尝试使用 Collection.sort,但它按 [*、+、-、/] 的顺序对上述运算符数组列表进行排序。它将除法放在末尾,而应该将除法放在乘法符号之后或之前

【问题讨论】:

  • 处理此问题的常用方法是将输入转换为前缀表示法并使用堆栈进行处理。 Here's a good example
  • 你为什么认为 sort 在这里会有帮助? sort 的作用是根据某种顺序重新排列集合中项目的顺序 - 默认情况下,这只是字符串的字典顺序。
  • 简单的方法是使用ScriptEngine : stackoverflow.com/questions/3422673/…
  • 我真的不认为这种排序在这里会有所帮助。起初我只是想找到一种方法来实际如果java根据数学中的操作顺序对运算符进行排序。
  • "java 根据操作顺序对运算符进行排序"--没有内置帮助。您可以编写自己的方法来执行此操作,但上面介绍的想法是实现目标的更好方法。

标签: java string for-loop arraylist calculator


【解决方案1】:

如果你想用大致相同的代码结构来做,而不是先把它变成类似逆波兰表示法的东西,你可以尝试一种以相反的优先级顺序处理操作的方法。

因此,假设您将*/ 作为最高优先级,并且您将它们视为同等优先级,因此从左到右处理; +- 也一样;那么你会

  1. 首先拆分+-
  2. 评估由+- 分隔的部分,但现在按从左到右的顺序处理*/
  3. 将您的+- 应用于这些评估部件。

因此,如果您的表达式是 3*4+5-6/2,那么您的代码将首先拆分为

3*4  +  5  -  6/2

现在计算这些子表达式

12  +  5  -  3

现在从左到右处理以评估最终答案

14

在更一般的术语中,您需要通过表达式的次数取决于您拥有的优先级数;并且您需要从最低到最高处理优先级。拆分表达式;仅考虑下一个优先级及更高级别递归评估子表达式;结合起来得到最终的答案。

这将是一个不错的 Java 8 流小练习!

【讨论】:

  • 仅作记录。这对我有用!谢谢
猜你喜欢
  • 2023-01-11
  • 1970-01-01
  • 2010-12-02
  • 1970-01-01
  • 1970-01-01
  • 2014-12-17
  • 1970-01-01
  • 2018-09-05
  • 1970-01-01
相关资源
最近更新 更多