繁体   English   中英

如何拆分 java 中组件的数学表达式?

[英]How to split mathematical expression on components in java?

我有一些关于拆分数学表达式的问题。

我想拆分每个数字、运算符和括号,并将它们发送到一个数组,这是我针对不同情况的代码:

String infix = "-(1/10)^(-2)-(-2)^(5)-2-3+1^(-2)";

//List<String>    tokenList = Arrays.asList(infix.split("(?<=[+*/()!^-])|(?=[+*/()!^-])"));
//List<String>    tokenList = Arrays.asList(infix.split("(?=[-+*/()])|(?<=[^-+*/][-+*/])|(?<=[()])"));
//List<String>     tokenList = Arrays.asList(infix.split("((?<=\\^)|(?=\\^))"));
List<String>     tokenList = Arrays.asList(infix.split("((?<=[+*/()!])|(?=[+*/()!]))|((?<=\\^)|(?=\\^))|([0-9]+(?<=[-])|(?=[-]))"));

我不能把它分开。 我经常表达错误

[1、10、/、-2、^、-2、5、-2、-3、^、1、-2、^、+、-、-]

我的程序不能除减号。 如果有-1-1 ,我的程序将其划分为 [-1,-1]。 请帮我解决这个问题。

同意亚伦。 该解决方案可以基于 FSM(有限 state 机器)。 本质上,您有一个字符串表达式,并且您正在开始解析。 此外,请考虑暂时为空的临时字符串变量。 当您读取第一个字符时,您将 go 写入变量并决定它是什么:在此示例中,它可以是数字、运算符或空格。 你跳到一个特殊的 state (它也应该存储在某个地方)。 然后您读取表达式中的下一个字符,现在您有了历史记录(当前的 state 和先前读取的字符)。 在这里,您可以决定令牌是否结束,并根据此情况跳转到另一个 state。

例如,您阅读"1" 你知道,例如,它可以是任意长度的数字。 您将"1"保留在变量中并读取下一个字符。 如果有另一个数字,您可以确定仍然存在相同的数字。 如果有空格或其他运算符,则将第一步中的"1"推送到标记列表或任何位置,清除字符串,并将下一个字符保留在其中。

很多时候,它可以使用switch-case运算符来实现。

我找到了关于我的问题的答案(下面的代码)。 这是解决这个问题的非常简单的方法。

List<String>     tokenList = Arrays.asList(infix.split(
        "((?<=\\^)|(?=\\^))|((?<=\\s[-+]\\s)" +
        "|(?=\\s[-+]\\s))|((?<=[()])|(?=[()]))" +
        "|((?<=[*/])|(?=[*/]))" +
        "|((?<=\\s[*/]\\s))"));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM