2016-01-03 99 views
2

我試着寫equals重寫函數。我認爲我已經寫好了,但問題是解析表達式。我有一個數組類型ArrayList<String>它需要從鍵盤輸入而不是評估結果。我可以與另一個ArrayList<String>變量進行比較,但我怎樣才能比較ArrayList<String>String。例如,簡單的數學表達式解析

String expr = "(5 + 3) * 12/3"; 
ArrayList<String> userInput = new ArrayList<>(); 
userInput.add("("); 
userInput.add("5"); 
userInput.add(" "); 
userInput.add("+"); 
userInput.add(" "); 
userInput.add("3"); 
. 
. 
userInput.add("3"); 
userInput.add(")"); 

然後轉換userInput爲字符串,然後比較使用等號 正如你看到的實在是太長了,當一個測試想申請。 我已經用來拆分,但它也拆分了組合數字。像1212

public fooConstructor(String str) 
{ 
    // ArrayList<String> holdAllInputs; it is private member in class 
    holdAllInputs = new ArrayList<>(); 

    String arr[] = str.split(""); 

    for (String s : arr) { 
     holdAllInputs.add(s); 
    } 
} 

正如你希望它不會給出正確的結果。它如何被修復?或者有人可以幫助編寫正則表達式來正確解析它,正如所希望的那樣? 作爲輸出我得到:

(,5, ,+, ,3,), ,*, ,1,2, ,/, ,3 

,而不是

(,5, ,+, ,3,), ,*, ,12, ,/, ,3 
+0

你如何添加12? 'userInput.add(「12」);''或'userInput.add(「1」);''userInput.add(「2」);'? – Guy

+0

'userInput.add(「12」);'@guy – askque

回答

3

正則表達式String.join

String result = String.join("", list); 

更多細節這裏可以幫助你的是

"(?<=[-+*/()])|(?=[-+*/()])" 

當然,你需要避免不必要的空間。

在這裏,我們走了,

String expr = "(5 + 3) * 12/3"; 
. 
. // Your inputs 
. 
String arr[] = expr.replaceAll("\\s+", "").split("(?<=[-+*/()])|(?=[-+*/()])"); 
for (String s : arr) 
{ 
    System.out.println("Element : " + s); 
} 

請參閱我expiriment:http://rextester.com/YOEQ4863

希望它能幫助。

0
this makes all the inputs into one string which can then be can be compared against the expression to see if it is equal 

String x = "";  

for(int i = 0; i < holdAllInputs.length; i++){ 
    x = x + holdAllInputs.get(i); 
} 

if(expr == x){ 
    //do something equal 
}else{ 
    //do something if not equal 
} 
0

而不是分裂的輸入令牌,你沒有一個正則表達式,這將是很好的前進加入列表中的字符串如:

StringBuilder sb = new StringBuilder(); 
for (String s : userInput) 
{ 
    sb.append(s); 
} 

然後使用sb.toString()後來作比較。我不會建議字符串連接使用+運算符詳細信息here

另一種方法是使用Apache Commons Lang中的StringUtils.join方法之一。

import org.apache.commons.lang3.StringUtils; 

String result = StringUtils.join(list, ""); 

如果你有幸使用Java 8是,那麼它更容易...只是用這種方法可用here

+0

我的問題與ArrayList變量無關,它是關於fooConstructor中的字符串變量。解析字符串後,我可以構造然後比較。 – askque

+0

這就是我想說的。不要在'fooConstructor'中解析String變量。而是將列表中的字符串組合起來以進行比較。 (除非你想使用一些很難消化的正則表達式) –