Java 解析字符串以计算数字

Java 解析字符串以计算数字,java,android,Java,Android,我有一个字符串,如:2+4*4/2,字符串可以长也可以短,但在这两种情况下,我都需要对其进行解析,并在进行加法和减法之前首先计算除法和乘法 我所做的是将字符串放入字符串数组,然后: double answer = 0; for(int i=0; i< array.length; i++) { if (array[i].equals(“+”)){ answer = Double.parseDouble(array[i-1]) + Double.parseDouble(

我有一个字符串,如:
2+4*4/2
,字符串可以长也可以短,但在这两种情况下,我都需要对其进行解析,并在进行加法和减法之前首先计算除法和乘法

我所做的是将字符串放入字符串数组,然后:

double answer = 0;
for(int i=0; i< array.length; i++) {
    if (array[i].equals(“+”)){
        answer = Double.parseDouble(array[i-1]) + Double.parseDouble(array[i+1]);
    }
}
double-answer=0;
for(int i=0;i

但是我需要一种方法来检测乘法和除法,并首先计算它们,然后将结果添加到字符串的其余部分。

您需要将字符串转换为后缀符号。详情如下:

实现提示:您需要一个操作符堆栈。解析字符串,每次找到操作数时,都将其复制到后缀字符串中。如果您找到一个运算符,则从堆栈中弹出每个优先级更高或相等的运算符,将它们复制到新字符串中,然后按实际运算符


之后,您必须进行实际的数学运算,并且需要使用操作数堆栈。在分析后缀表示法中的字符串时,如果得到一个操作数(数字),则将其推送到堆栈上。如果得到运算符,则获取堆栈上的最后两个元素,然后使用所使用的运算符返回这两个元素的结果。

我创建了演示程序,这将有助于解决您的查询:

import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

public class CalculatingString
{
    public static void main(String[] args)
    {
        String string="2323*1212-3434+12*200/2";
        System.out.println("Result : "+getAnswer(string));
    }

    private static List<Character> getSymbols(String string)
    {
        List<Character> listOfSymbols=new LinkedList<Character>(); 
        for(int i=0;i<string.length();i++)
        {
            char symbol=string.charAt(i);

            if(symbol=='-' || symbol=='+' || symbol=='*' || symbol=='/')
            {
                listOfSymbols.add(symbol);
            }
        }
        return listOfSymbols;
    }

    private static List<String> getOperands(String string)
    {
        String[] operandsArray=string.split("-|\\+|\\*|\\/");
        List<String> listOfOperands=new LinkedList<String>();

        for(int i=0;i<operandsArray.length;i++)
            listOfOperands.add(operandsArray[i]);

        return listOfOperands;
    }

    private static void listUpdater(List<Character> listOfSymbols,List<String> listOfOperands,int position,float result)
    {
        listOfSymbols.remove(position);
        listOfOperands.remove(position);
        listOfOperands.remove(position);
        listOfOperands.add(position,String.valueOf(result));
        //System.out.println("===========================================================================");
    }

    private static float getAnswer(String string)
    {
        List<Character> listOfSymbols=getSymbols(string);
        List<String> listOfOperands=getOperands(string);
        int operationCount=listOfSymbols.size();
        float operand1=0.0F;
        float operand2=0.0F;
        float result=0.0F;

        while(operationCount>0)
        {
            if(listOfSymbols.contains('*') || listOfSymbols.contains('/'))
            {
                int currentPositionMultiplication=listOfSymbols.indexOf('*');
                int currentPositionDividation=listOfSymbols.indexOf('/');

                if((currentPositionMultiplication<currentPositionDividation && currentPositionMultiplication!=-1) || currentPositionDividation==-1)
                {
                    operand1=Float.parseFloat(listOfOperands.get(currentPositionMultiplication));
                    operand2=Float.parseFloat(listOfOperands.get(currentPositionMultiplication+1));
                    result=operand1*operand2;

                    listUpdater(listOfSymbols,listOfOperands,currentPositionMultiplication,result);
                }
                else if((currentPositionMultiplication>currentPositionDividation && currentPositionDividation!=-1) || currentPositionMultiplication==-1)
                {
                    operand1=Float.parseFloat(listOfOperands.get(currentPositionDividation));
                    operand2=Float.parseFloat(listOfOperands.get(currentPositionDividation+1));
                    result=operand1/operand2;

                    listUpdater(listOfSymbols,listOfOperands,currentPositionDividation,result);
                }

            }
            else if(listOfSymbols.contains('-') || listOfSymbols.contains('+'))
            {
                int currentPositionSubstraction=listOfSymbols.indexOf('-');
                int currentPositionAddition=listOfSymbols.indexOf('+');

                if((currentPositionSubstraction<currentPositionAddition && currentPositionSubstraction!=-1) || currentPositionAddition==-1)
                {
                    operand1=Float.parseFloat(listOfOperands.get(currentPositionSubstraction));
                    operand2=Float.parseFloat(listOfOperands.get(currentPositionSubstraction+1));
                    result=operand1-operand2;

                    listUpdater(listOfSymbols,listOfOperands,currentPositionSubstraction,result);
                }
                else if((currentPositionSubstraction>currentPositionAddition && currentPositionAddition!=-1) || currentPositionSubstraction==-1)
                {

                    operand1=Float.parseFloat(listOfOperands.get(currentPositionAddition));
                    operand2=Float.parseFloat(listOfOperands.get(currentPositionAddition+1));
                    result=operand1+operand2;

                    listUpdater(listOfSymbols,listOfOperands,currentPositionAddition,result);
                }

            }
            operationCount--;
        }

        Iterator<String> iterator=listOfOperands.iterator(); 

        String finalResult="";

        while(iterator.hasNext())
        {
            finalResult=iterator.next();
        }

        return Float.parseFloat(finalResult);
    }
}
import java.util.Iterator;
导入java.util.LinkedList;
导入java.util.List;
公共类计算字符串
{
公共静态void main(字符串[]args)
{
String String=“2323*1212-3434+12*200/2”;
System.out.println(“结果:+getAnswer(字符串));
}
私有静态列表getSymbols(字符串)
{
List-listOfSymbols=new-LinkedList();

对于(int i=0;i,
“+”
中的双引号只是为了说明?它是这样的??或者你想写你自己的??JAVA在计算过程中遵循BODMAS符号。我不能从你的问题中了解太多。但是有很多答案围绕着它。,