Java 从定义为字符串的运算符执行算术运算

Java 从定义为字符串的运算符执行算术运算,java,algorithm,operators,Java,Algorithm,Operators,我最近一直试图找到解决这个问题的办法,但到目前为止我一直没有成功 我正在考虑做一个运算a#b#c#d,其中a、b、c和d是预定义的常量,并且#可以取以下任何运算符“+”、“-”、“*”、“/”的值 我在考虑为#中的所有操作员替换找到所有可能(不同)的a#b#c#d解决方案 我在想以下几行的逻辑: // Global declaration of an array list static ArrayList<Double> values; String[] chars = {"+",

我最近一直试图找到解决这个问题的办法,但到目前为止我一直没有成功

我正在考虑做一个运算
a#b#c#d
,其中a、b、c和d是预定义的常量,并且#可以取以下任何运算符“+”、“-”、“*”、“/”的值

我在考虑为#中的所有操作员替换找到所有可能(不同)的
a#b#c#d
解决方案

我在想以下几行的逻辑:

// Global declaration of an array list
static ArrayList<Double> values;

String[] chars = {"+", "-", "*", "/"};
int totalSolutions = 0;
values = new ArrayList<Integer>();
for (int i=0; i<chars.length; i++){
   for (int j=0; j<chars.length; j++){
      for (int k=0; k<chars.length; k++){
         if (isNew(a chars[i] b chars[j] c chars[k] d)) totalSolutions += 1;
      }
   }
}
public static boolean isNew(double value){
   if (values.contains(value)) return false;
   else values.add(value);
   return true;
}
//数组列表的全局声明
静态数组列表值;
字符串[]字符={“+”,“-”,“*”,“/”};
整数=0;
值=新的ArrayList();

对于(inti=0;i,从JDK1.6开始,您可以使用内置的Javascript引擎为您计算这个表达式

import javax.script.ScriptEngineManager;
import javax.script.ScriptEngine;

public class Main {
  public static void main(String[] args) throws Exception{
    ScriptEngineManager manager = new ScriptEngineManager();
    ScriptEngine engine = manager.getEngineByName("JavaScript");
    String expression = "100+200/100*2";
    System.out.println(engine.eval(expression));
    } 
}
因此,您可以使用它根据运算符优先级规则计算表达式

另外,如果您只需要解决方案的计数,那么使用
TreeSet
然后在末尾打印集合的大小可能会更容易

下面是一个完整的解释:

public class Main {

    public static void main(String[] args) {
        ScriptEngineManager manager = new ScriptEngineManager();
        ScriptEngine engine = manager.getEngineByName("JavaScript");
        int a = 100;
        int b = 200;
        int c = 300;
        int d = 100;
        String[] chars = {"+", "-", "*", "/"};
        try {
            TreeSet<String> set = new TreeSet<>();
        for (int i=0; i<chars.length; i++){
           for (int j=0; j<chars.length; j++){
                for (int k=0; k<chars.length; k++){
                    String expression = a+chars[i]+b+chars[j]+c+chars[k]+d;
                         set.add(String.valueOf(engine.eval(expression)));
                }
            }
        }
        System.out.println(set.size());
        } catch (ScriptException ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}
公共类主{
公共静态void main(字符串[]args){
ScriptEngineManager管理器=新建ScriptEngineManager();
ScriptEngine=manager.getEngineByName(“JavaScript”);
INTA=100;
int b=200;
int c=300;
int d=100;
字符串[]字符={“+”,“-”,“*”,“/”};
试一试{
树集=新树集();

对于(int i=0;我希望你的实现忽略运算的优先级,如果a+b*c,它会先计算b*c吗?我更喜欢有运算优先级的实现。但是没有它现在就可以了。你能为isNew函数发布代码吗?我不认为它在做它应该做的事情。看看它可能会给你一些想法。嗯,在我的cas中e它不明显,因为结果不明显(总是8)。但我明白你的意思。但是,我认为你必须编写一个小解析器和计算器。谢谢@Ahmed,这让我在遵循运算符优先级的同时计算表达式。