Java 如何编制程序根据数学运算顺序进行相应计算?(爪哇)

Java 如何编制程序根据数学运算顺序进行相应计算?(爪哇),java,string,for-loop,arraylist,calculator,Java,String,For Loop,Arraylist,Calculator,我正在尝试用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 oper

我正在尝试用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
    }

}
package numberofcharacters;
导入java.util.ArrayList;
公共类应用程序{
公共静态void main(字符串[]args){
字符串toCalculate=“123+98-79÷2*5”;
int运算符_计数=0;
ArrayList运算符=新的ArrayList();
for(int i=0;i
****问题是我需要按照数学中的运算顺序进行计算,比如首先是乘法和除法,而不是加法和减法。 我如何解决这个问题****

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


[p.S]我尝试使用Collection.sort,但它按照[*,+,-,/]的顺序对上面的arraylist运算符进行排序。它把除法放在末尾,而它应该把除法放在乘法符号之后或之前

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

所以假设
*
/
具有最高优先级,并且将它们视为同等优先级,因此从左到右处理;对于
+
-
也一样;那你会的

  • 首先在
    +
    -
    上拆分
  • 评估由
    +
    -
    分隔的部分,但现在按从左到右的顺序处理
    *
    /
  • +
    -
    应用于这些评估零件
  • 因此,如果您的表达式是
    3*4+5-6/2
    ,那么您的代码将首先拆分为

    3*4  +  5  -  6/2
    
    现在计算这些子表达式

    12  +  5  -  3
    
    现在从左到右处理以评估最终答案

    14
    
    更一般地说,通过表达式所需的通过次数取决于优先级的数量;您需要从最低到最高处理优先级。分裂表达;递归地计算子表达式,只考虑下一个优先级和上一个优先级;合并得到最终答案


    这将是一个很好的Java8Streams小练习

    处理这种情况的一种常用方法是将输入转换为前缀符号,并使用堆栈进行处理。你为什么认为sort在这里会有帮助?排序的作用是根据某种顺序重新排列集合中项目的顺序——默认情况下,这只是字符串的字典顺序。简单的方法是使用ScriptEngine:我真的认为这种排序在这里没有帮助。起初,我只是想找到一种方法,来验证java是否根据数学中的运算顺序对运算符进行排序。“java根据运算顺序对运算符进行排序”——这方面没有内置的帮助。你可以写你自己的方法来实现这一点,但是上面提到的想法是实现目标的更好的方法。仅供记录。这对我有用!非常感谢。