簡體   English   中英

從定義為字符串的運算符執行算術運算

[英]Perform arithmetic operations from operators defined as strings

我最近一直試圖找到解決這個問題的方法,但到目前為止我一直沒有成功。

我正在考慮對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;
}

isNew()是一個函數,它只檢查所獲得的新解決方案是否與獲得的所有先前解決方案不同。

我還沒有找到在操作數之間應用運算符的方法。

非常感謝任何幫助。

從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);
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM