简体   繁体   中英

evaluating an expression in string form containing variables in Java

I have used EvalEx ( https://github.com/uklimaschewski/EvalEx ) and modified it to make a calculator without packages like math . so now it can get an input in string form from the user and print out the result.

like this :

Enter an Expression: ADD(DIV(SIN(FACT(3)),CEIL(TAN(MUL(1.5,FIB(4))))),GCD(2,10)) 
The Result is: 1.94    

now the user will enter expressions that contain variables instead of constants

ADD(DIV(SIN(FACT(X1)),CEIL(TAN(MUL(1.5,FIB(X2))))),GCD(Y,10))    

and the overall code should work like below when run :

Enter an Expression: ADD(DIV(SIN(FACT(X1)),CEIL(TAN(MUL(1.5,FIB(X2))))),GCD(Y,10))     
Enter Variables: X1,X2,Y    
Enter values for X1, X2 and Y by this order(separate the values by space): 3 4 2    
The Result is: 1.94        

note that the user first enters the expression then will tell the machine what are the variables (as in " enter variables : x1,x2,y" ) also I have to use objective programming concepts ( so each function of the expression and its constants or variables should be kept as an object )

so how can I change the existing code from EvalEx to make the program to identify the variables ?

You can set up a Map<String, Double> that associates variable names to values, like this:

Map<String, Double> values = new HashMap<String, Double>();
values.put("X", 13.5);
values.put("Y", -3);

Then you can replace all of the variables in the expression by their corresponding values, like this:

for (Map.Entry<String, Double> entry : values.entrySet())
    expression = expression.replace(entry.getKey(), entry.getValue().toString());

Then you can just apply the method you've already written to expression .

This approach is simple, but not very robust. For example, if one of your variable names names is "C" you will mess up the function "CEIL" . For this reason, you could insist that all variables begin with "_" or something similar.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM