Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 简单数学表达式解析_Java_Regex_String_Arraylist - Fatal编程技术网

Java 简单数学表达式解析

Java 简单数学表达式解析,java,regex,string,arraylist,Java,Regex,String,Arraylist,我尝试编写等于覆盖函数。我认为我写得对,但问题是解析表达式。我有一个数组类型ArrayList,它从键盘获取输入,然后计算结果。我可以与另一个ArrayList变量进行比较,但是如何将ArrayList与String进行比较呢。比如说, String expr=“(5+3)*12/3”; ArrayList userInput=新的ArrayList(); userInput.add(“”); userInput.add(“5”); userInput.add(“”); userInput.ad

我尝试编写
等于
覆盖函数。我认为我写得对,但问题是解析表达式。我有一个数组类型
ArrayList
,它从键盘获取输入,然后计算结果。我可以与另一个
ArrayList
变量进行比较,但是如何将
ArrayList
String
进行比较呢。比如说,

String expr=“(5+3)*12/3”;
ArrayList userInput=新的ArrayList();
userInput.add(“”);
userInput.add(“5”);
userInput.add(“”);
userInput.add(“+”);
userInput.add(“”);
userInput.add(“3”);
.
.
userInput.add(“3”);
userInput.add(“)”;
然后将userInput转换为字符串,然后使用equals进行比较 正如您所看到的,要应用测试的时间太长了。 我过去经常拆分,但它也拆分合并的数字。像
12
1
2

public构造函数(String str)
{
//ArrayList holdAllInputs;它是类中的私有成员
holdAllInputs=newarraylist();
字符串arr[]=str.split(“”);
用于(字符串s:arr){
保持输入。添加;
}
}
正如你所料,它不会给出正确的结果。怎么能修好呢?或者有人可以帮助编写正则表达式,以便根据需要正确解析它吗? 作为输出,我得到:

(,5,+,3,),*,1,2,/,3
而不是

这使所有输入成为一个字符串,然后可以将该字符串与表达式进行比较,以确定其是否相等
字符串x=“”;
对于(int i=0;i
与其将输入拆分为没有正则表达式的令牌,不如继续将字符串加入列表中,如:

StringBuilder sb = new StringBuilder();
for (String s : userInput)
{
    sb.append(s);
}
然后稍后使用sb.toString()进行比较。我不会建议使用
+
运算符详细信息进行字符串连接

另一种方法是使用ApacheCommonsLang中的一种方法

import org.apache.commons.lang3.StringUtils;

String result = StringUtils.join(list, "");
如果您足够幸运地使用了Java8,那么它就更容易了……只需使用

有关此方法的更多详细信息,请参见

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

”(?如何添加12?
userInput.add(“12”);
userInput.add(“1”);
userInput.add(“2”);
userInput.add(“12”);
@guy我的问题与ArrayList变量无关,而是关于fooConstructor中的字符串变量。解析字符串后,我可以构造然后进行比较。这就是我想说的。不要在
fooConstructor
中解析字符串变量。而是将列表中的字符串合并以执行比较。(除非你想使用一些难以消化的正则表达式)
import org.apache.commons.lang3.StringUtils;

String result = StringUtils.join(list, "");
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);
}