2013-02-26 14 views
7

चलें कहते हैं कि मैं एक विधि है कि इस तरह से घोषित की गई है:एक स्ट्रिंग को एक मैथ अभिव्यक्ति में बदलें?

public double Calc(String expression) { 

// Code 

} 

मैं की तरह

"2 + 4 - (3 * 4)" 

एक स्ट्रिंग अभिव्यक्ति ले तो Calc() करने के लिए इसे खिलाने के लिए चाहते हैं और यह मूल्य है कि यह हो जाता है वापस आ जाएगी।

क्या आप एक स्ट्रिंग से मैथ एक्सप्रेशन को पार कर सकते हैं ताकि यह एक अभिव्यक्ति बन जाए कि जावा समझ सकता है? क्योंकि आम तौर पर आप केवल

return 2 + 4 - (3 * 4); 

लिख सकते हैं लेकिन यह केवल उस एकल अभिव्यक्ति के लिए ही काम करेगा।

+0

इस पर एक नज़र डालें: http://stackoverflow.com/questions/2605032/using-eval-in-java –

+1

अपनी खुद की आप सामान्य रूप से एक अभिव्यक्ति पेड़ http का उपयोग करेंगे रोल करने के लिए: //en.wikipedia .org/wiki/Binary_expression_tree –

+0

@beto लेकिन ऐसा लगता है कि ऐसा करने से, आप बस एक ही काम करने के लिए पूरे जेएस इंजन को खोलते हैं। हालांकि मुझे लगता है कि मुझे एक संकेत दिया। धन्यवाद! – OmniOwl

उत्तर

6

मैं डिजस्ट्रा के ट्विस्टैक एल्गोरिदम का उपयोग करने का सुझाव दूंगा।

यह काफी आपको क्या चाहिए किया जाना चाहिए:

public class DijkstraTwoStack { 
    public static void main(String[] args) { 
       Scanner scanner = new Scanner(System.in); 
       String exp[] = scanner.nextLine().split(" "); 
     Stack<String> ops = new Stack<String>(); 
     Stack<Double> vals = new Stack<Double>(); 

     for(int i = 0; i < exp.length; i++) { 
         String s = exp[i]; 
      if (s.equals("(")) { 
      } 
      else if (s.equals("+") || s.equals("*")) { 
       ops.push(s); 
      } else if (s.equals(")")) { 
       getComp(ops, vals); 
      } else { 
       vals.push(Double.parseDouble(s)); 
      } 
     } 
     getComp(ops, vals); 
     System.out.println(vals.pop()); 
    } 

    private static void getComp(Stack<String> ops, Stack<Double> vals) { 
     String op = ops.pop(); 
     if (op.equals("+")) { 
      vals.push(vals.pop() + vals.pop()); 
     } else if (op.equals("*")) { 
      vals.push(vals.pop() * vals.pop()); 
     } 
    } 
} 

यह परीक्षण नहीं किया है, लेकिन यह सही के बारे में होना चाहिए।

+0

इतना कुशल नहीं है, लेकिन कोई इसका उपयोग कर सकता है .... 'ScriptEngineManager manager = new ScriptEngineManager(); स्क्रिप्टइंजिन इंजन = manager.getEngineByName ("जेएस"); ऑब्जेक्ट परिणाम = इंजन.वेल ("3 + 4"); ' * क्रेडिट: http://stackoverflow.com/a/2605051/936786 –

+0

कृपया मौजूदा उत्तरों से कोड को न बदलें।कोई इटरेटर नहीं चाहता था, यह एल्गोरिदम तोड़ देगा। –

0

मुझे बताएं कि एक राज्य एक प्रक्रिया के रूप में है जो मुझे लगता है कि एसओ पर कुछ प्रश्नों पर ब्राउज़ करने के दौरान मुझे अपनाया जा सकता है, आपको जेएस कंपाइलर लोड किए बिना इसे कैसे करना है, इस पर एक उचित विचार प्राप्त करना चाहिए।

स्टार्टर्स के लिए आपको अपनी स्ट्रिंग को उस फ़ंक्शन के माध्यम से पार्स करने की आवश्यकता है जो आपके गणित स्ट्रिंग को एक इंफिक्स स्ट्रिंग में परिवर्तित करता है। फिर यह मूल रूप से इस अभिव्यक्ति का मूल्यांकन आपके उत्तर को वापस करने के लिए एक लूप में स्ट्रिंग को तोड़कर एक और फ़ंक्शन के रूप में करता है। एक खूबसूरती से विस्तृत प्रक्रिया found here हो सकती है।

संबंधित मुद्दे