मैं एक स्ट्रिंग मूल्यांकन कार्य अर्थातलेखन स्ट्रिंग मूल्यांकन कार्य
evaluate("4 + 1") ; // returns 5
evaluate("4 + 1 + 3") ; // returns 8
evaluate("4 + 1 * 3") ; // returns 7 (not 15)
The operators are + -/and *
लिखने के लिए कोशिश कर रहा हूँ मेरी प्रारंभिक हालांकि रेगुलर एक्सप्रेशन का उपयोग करने के लिए ऑपरेटरों और इन मिलान किया जा सकता के रूप में अंक एकत्र करने के लिए किया गया था। और उस जानकारी को ढूंढने के बाद, किसी भी तरह /*
ओवी -+
ऑपरेटरों को प्राथमिकता देने का एक तरीका पता लगाएं।
यहाँ मैं कैसे शुरू कर दिया है:
static String regex = "([\\+\\*-/])+";
static String digitRegex = "(\\d)+";
public static void main(String[] args) {
System.out.println(getOperators("4 + 1 * 3"));
}
public static List<String> getOperators(String input) {
Pattern p = Pattern.compile(regex);
Matcher matcher = p.matcher(input);
List<String> operatorList = new ArrayList<String>();
int count = 0;
while (matcher.find()){
if (matcher.group(count) != null && matcher.group(count).trim().length() > 0) {
operatorList.add(matcher.group(count));
count++;
}
}
return operatorList;
}
अब मैं एक ही तर्क का प्रयोग अंक निकालने के लिए एक और तरीका लिख सकते हैं।
public static List<Integer> getDigits(String input) {
Pattern p = Pattern.compile(digitRegex);
Matcher matcher = p.matcher(input);
List<Integer> digitList = new ArrayList<Integer>();
int count = 0;
while (matcher.find()) {
if (matcher.group(count) != null && matcher.group(count).trim().length() > 0) {
digitList.add(Integer.valueOf(matcher.group(count)));
count++;
}
}
return digitList;
}
अब वह हिस्सा है जहां मैं फंस गया हूं। # 1 यह उपरोक्त विधि तीसरा उदाहरण पर विफल रहता है:
evaluate("4 + 1 * 3") ; // returns 7 (not 15)
और इस # 2 यहां तक कि अगर मैं पिछले उदाहरण की कोशिश, मैं यह समझ नहीं सकता बाहर कैसे उन्हें सही क्रम में डाल करने के लिए।
क्या मैं सही रास्ते पर हूं, क्या किसी के पास कुछ उपयोगी सलाह है कृपया साझा करें?
यह एक [ऑपरेटर पूर्वता] (http: // en.wikipedia.org/wiki/Order_of_operations) समस्या। एक पुनरावर्ती मूल पार्सर में, आप केवल निम्न प्राथमिकता ऑपरेटरों से उच्च प्राथमिकताओं तक उतरते हैं, और शीर्ष पर वापस जाने के लिए मूलभूत ऑपरेटर का उपयोग करते हैं। –
मुझे आशा है कि इससे मदद मिलती है: http://en.wikipedia.org/wiki/Recursive_descent_parser – sarnold
अभिव्यक्ति 'मूल्यांकन ("4 + 1 * 3"); 'वापस लौटना चाहिए।यदि आप 15 लौटने के लिए चाहते थे तो आपको 'मूल्यांकन ("(4 + 1) * 3" लिखा जाना चाहिए था); ' – alfasin