我用Java创建一个计算器。
如果我让用户输入一个字符串,例如:
7+4-(18/3)/2
到目前为止,我必须让用户在每个号码或运营商之间输入一个空格。 我如何从给定的字符串创建一个数组,其中字符串被分割为数字或运算符,所以在这种情况下数组将是:
[7, +, 4, -, (, 18, /, 3, ), /, 2]
(数组的类型为String)
任何帮助都会非常感激
谢谢:)
答案 0 :(得分:4)
试试这个:
String[] temp = expression.split("[\s+-\\\(\)]+");
会分开:
+
运营商-
运营商\
字符(
字符)
字符答案 1 :(得分:1)
我这样做的方法就是自己扫描一下这个字符串。无论如何,你都希望从结果中构建一个操作,这样你就不会通过使用自动解析器/拆分器等获得任何东西。
以下是代码的草图:
List<Operations> ops = new ArrayList();
for (int i=0;i<str.length();i++) {
char c = str.get(i);
if (c == '.' || c >= '0' || c<='9') {
// extract a number, moving i onwards as I do
// insert number into ops (new Operation(num))
} else if (c!= ' ') {
Operator operator = operators.get(c);
if (operator == null) {
// Handle invalid input - could just skip it
} else {
// Add operator to ops
}
}
}
您需要为每个符号定义运算符。
完成后,您已解析出字符串以仅保存重要数据并编制了一系列操作列表。
现在你需要弄清楚如何处理应用正确的优先级规则等的操作列表:)最简单的方法可能就是每次执行每次有效的计算时重复遍历列表。
即
1+2*(3+4)-(4+2)
第一遍:
1+2*12-6
第二遍:
1+24-6
结果:
19
答案 2 :(得分:1)
您尚未指定要对阵列执行的操作。如果你真的想要评估表达式,那么已经有可用的库。你可以使用其中一个。但是如果你只想要一个类似于你所展示的阵列,那么我也不建议使用正则表达式。您可以编写自己的解析器方法,如下所示:
public static String[] parseExpression(String str) {
List<String> list = new ArrayList<String>();
StringBuilder currentDigits = new StringBuilder();
for (char ch: str.toCharArray()) {
if (Character.isDigit(ch)) {
currentDigits.append(ch);
} else {
if (currentDigits.length() > 0) {
list.add(currentDigits.toString());
currentDigits = new StringBuilder();
}
list.add(String.valueOf(ch));
}
}
if (currentDigits.length() > 0)
list.add(currentDigits.toString());
return list.toArray(new String[list.size()]);
}
现在称之为:
String str = "7+4-(18/3)/2";
System.out.println(Arrays.toString(parseExpression(str)));
你会得到你的结果。
答案 3 :(得分:0)
我的第一次尝试是使用"\b"
,但没有拆分-(
。经过一番搜索,我想出了这个:
(?<=[\(\)\+\-*\/\^A-Za-z])|(?=[\(\)\+\-*\/\^A-Za-z])
所以,你必须逃避它并像这样使用它:
String input = ...;
String temp[] = input.split("(?<=[\\(\\)\\+\\-*\\/\\^A-Za-z])|(?=[\\(\\)\\+\\-*\\/\\^A-Za-z])");
System.out.println(Arrays.toString(temp));
输入:
7+4-(18/3)/2a^222+1ab
输出:
[7, +, 4, -, (, 18, /, 3, ), /, 2, a, ^, 222, +, 1, a, b]
在此见到它:
http://rubular.com/r/uHAObPwaln
http://ideone.com/GLFmo4