将表示数学表达式的String转换为数组

时间:2014-08-06 23:12:07

标签: java arrays string split

我想将1+40.2+(2)之类的字符串转换为字符串数组[1, +, 40.2, +, (, 2, )],以便将其用作我的Calculator类中的Shunting Yard算法的参数。

输入的内容不会有空格,所以我不能只使用input.split("\\s+")。我想出了一个涉及ArrayLists,StringBuilders和堆栈的漫长过程,但我想知道是否有更简单的方法来执行此操作。

input.split("")无法工作,因为它会返回[1, +, 4, 0, ., 2, +, (, 2, )]。这实际上是我当前进程的起点,我可以为它发布伪代码,如果有人感兴趣的话(尽管我实际上在实现我的伪代码时遇到了问题)。

感谢任何建议或帮助。谢谢!

2 个答案:

答案 0 :(得分:2)

我非常喜欢第一个答案,但是如果你想按照第二条评论的建议尝试使用正则表达式,这里有一个正则表达式,它将逐个匹配你方程式中的每个元素,这样你就可以附加到你的列表中。请注意,它假定所有字符串都包含小数点数,运算符和括号。

[0-9\.]+|[+\-*/]|[()]

请注意,在字符类中,除^ - ] \之外的任何字符都是文字,因此这就是字符类看起来有点滑稽的原因。要构造相应的Java模式,请使用

Pattern.compile("[0-9\\.]+|[+\\-*/]|[()]")

示例:

String s = "1+40.2+(2)";
Pattern p = Pattern.compile("[0-9\\.]+|[+\\-*/]|[()]");
Matcher m = p.matcher(s);
while (m.find()) {
    System.out.println(m.group());
}

输出:

1
+
40.2
+
(
2
)

答案 1 :(得分:1)

replaceAll字符串方法应该能够为您提供帮助。用这个来围绕你想要用一个特殊的分割角色拉出的代币(我随意选择了':',但是你有信心赢得的任何字符/字符串实际上都在输入将起作用)。然后你可以拆分那个角色。

 String s = "1+40.2+(2)";
 String dividingToken = ":";
 String[] sSplit = s.replaceAll("\\+", dividingToken + "+" + dividingToken)
                    .replaceAll("\\(", dividingToken + "(" + dividingToken)
                    .replaceAll("\\)", dividingToken + ")" + dividingToken)
                    .split(dividingToken);
 for(String str: sSplit){
    System.out.println(str);
 }

输出:

1
+
40.2
+

(
2
)

你可以轻松地将.replaceAll循环到一系列令牌上[[" +"," - "," *",...] )你想分手。只记得添加" //"在它之前取代所有因为它们中的许多都具有特殊的正则表达式意义,而你实际上想要匹配" +"。