我的答案有点不同,因为我假设您最终想要运算符以及值。
以下是我其中一次测试运行的结果。
Original Equation: 1+2*3(30+4/2-(10+2))*2+1
Expanded Equation: 1 + 2 * 3 ( 30 + 4 / 2 - ( 10 + 2 ) ) * 2 + 1
看起来我所做的只是在方程式中添加了空格。实际上,我所做的是将方程式分成几个部分,并打印每个部分,然后加上一个空格。
以下是我编写的代码,用于从原始方程式创建一个
List<String>
的部分列表。
private List<String> parseEquation(String equation) {
List<String> parts = new ArrayList<>();
StringBuilder builder = new StringBuilder();
String testCharacters = "+-*/()";
char[] letters = equation.toCharArray();
for (int i = 0; i < letters.length; i++) {
if (letters[i] == ' ') {
continue;
}
if (Character.isDigit(letters[i])) {
builder.append(letters[i]);
continue;
}
if (letters[i] == '.') {
builder.append(letters[i]);
continue;
}
if (contains(letters[i], testCharacters)) {
addPart(parts, builder);
parts.add(Character.toString(letters[i]));
}
}
addPart(parts, builder);
return parts;
}
private void addPart(List<String> parts, StringBuilder builder) {
if (builder.length() > 0) {
parts.add(builder.toString());
builder.delete(0, builder.length());
}
}
private boolean contains(char c, String text) {
for (int i = 0; i < text.length(); i++) {
char t = text.charAt(i);
if (c == t) {
return true;
}
}
return false;
}
addPart
方法是一个实用工具方法,用于检查空部分。如果该部分不为空,则此方法将该部分添加到List
中。
contains
方法是一个实用工具方法,允许我使用一个if
语句检查所有的运算符和括号。
parseEquation
方法不使用任何花哨的正则表达式。这很直接。
我检查方程式中的每个字符。如果字符是空格,则跳过该字符。如果字符是数字或小数点,则将其添加到StringBuilder
以创建数字。如果字符是运算符或括号,则将前一个数字添加到部分List
中,然后将运算符或括号添加到部分List
中。
我使用continue
语句跳过for
循环的底部,并使代码更加整洁。我没有嵌套的if
语句和continue
语句。
这是完整可运行的代码。你可以通过注释的那一行看到我也写了一个方程求解器。那部分代码就留给你了。
import java.util.ArrayList;
import java.util.List;
public class EquationSolver {
private static final String FORMAT = "%-30s";
public static void main(String[] args) {
String equation = "1+2*3(30+4/2-(10+2))*2+1";
String title = String.format(FORMAT, "Original Equation:");
System.out.println(title + equation);
EquationSolver es = new EquationSolver();
List<String> parts = es.parseEquation(equation);
title = String.format(FORMAT, "Expanded Equation:");
System.out.println(title + es.toString(parts));
}
private List<String> parseEquation(String equation) {
List<String> parts = new ArrayList<>();
StringBuilder builder = new StringBuilder();
String testCharacters = "+-*/()";
char[] letters = equation.toCharArray();
for (int i = 0; i < letters.length; i++) {
if (letters[i] == ' ') {
continue;
}
if (Character.isDigit(letters[i])) {
builder.append(letters[i]);
continue;
}
if (letters[i] == '.') {
builder.append(letters[i]);
continue;
}
if (contains(letters[i], testCharacters)) {
addPart(parts, builder);
parts.add(Character.toString(letters[i]));
}
}
addPart(parts, builder);
return parts;
}
private void addPart(List<String> parts, StringBuilder builder) {
if (builder.length() > 0) {
parts.add(builder.toString());
builder.delete(0, builder.length());
}
}
private boolean contains(char c, String text) {
for (int i = 0; i < text.length(); i++) {
char t = text.charAt(i);
if (c == t) {
return true;
}
}
return false;
}
private String toString(List<String> parts) {
StringBuilder builder = new StringBuilder();
for (String s : parts) {
builder.append(s).append(" ");
}
return builder.toString().trim();
}
}
convert.split("")
。尝试打印arr
的内容并查看它们如何改进。 - David Soroko