【发布时间】:2019-01-30 10:54:00
【问题描述】:
我已经使用处理开发环境制作了一个图形计算器应用程序,并包含了一个 Java Operation 类。然后我在我的主文件-calculator.pde 中调用了Operation 类的实例。 当我在多个实例上调用该方法时,有条件地,由于调用该方法的循环和条件,它会多次打印该方法的输出。
这是Operation 类的calculate() 方法:
String calculate() {
int operationIndex = userInput.indexOf(operationSymbol);
ArrayList<String> clickedNumbers = new ArrayList<String>();
System.out.println(operation + " index: " + operationIndex);
for (int i = 0; i < operationIndex; i++) {
clickedNumbers.add(userInput.get(i)); }
double double1 = calculator.stringToDouble(String.join("", clickedNumbers));
System.out.println("double1: " + double1);
clickedNumbers.clear();
int equalsIndex = userInput.indexOf("=");
for (int i = operationIndex + 1; i < equalsIndex; i++) {
clickedNumbers.add(userInput.get(i));
}
double double2 = calculator.stringToDouble(String.join("", clickedNumbers));
System.out.println("double2: " + double2);
Double operResult = this.doOperation(double1, double2);
String operationResult = calculator.doubleToString(operResult);
System.out.println("Operation Result: " + operationResult);
return operationResult;
}
所有System.out.println() 语句都依赖于方法内的局部变量。这些应该只打印到控制台一次。每当用户输入一个操作并按下等于时,例如,如果他/她输入15 * 3,它就会输出:
上面,控制台输出的高亮部分是我想要的输出。
这是我调用 calculate() 方法的代码:
String[] numberStr = {"1", "2", "3", "4", "5", "6", "7", "8", "9"};
Boolean pressedEquals = listName.contains("=");
for(String number : numberStr) {
Boolean pressedNumber = listName.contains(number);
if (pressedNumber && pressedEquals) {
if (listName.contains("+")) {
processStatement = "Adding Numbers...";
result = addition.calculate();
}
else if (listName.contains("-")) {
processStatement = "Subtracting Numbers...";
result = subtraction.calculate();
}
else if (listName.contains("*")) {
processStatement = "Multiplying Numbers...";
result = multiplication.calculate();
}
else if (listName.contains("/")) {
processStatement = "Dividing Numbers...";
result = division.calculate();
}
else if (listName.contains("%")) {
processStatement = "Modulufying Numbers...";
result = modulus.calculate();
}
else if (listName.contains("^")) {
processStatement = "Expounding numbers...";
result = exponential.calculate();
}
}
}
我不明白为什么它打印输出的次数是userInputArrayList 的长度。我知道问题是for 循环中的pressedNumber 布尔值。我知道this question 上的 OP 也有同样的问题,它会根据用户输入的长度打印多次,但问题的答案并没有解释它为什么这样做。
无效的研究和试验
解决这个问题的一部分是将processStatement 变成一个变量,因为之前我只是在条件中打印它。这不起作用,因为它打印了多次。我不能对方法内部的println 语句执行此操作,因为它们依赖于方法内部的变量,并且语句数量很多。我的第二个计划是创建一个静态方法printInfo(),但这也行不通,因为变量的范围太窄,我不能在外面定义它们,因为那样就不准确了。
更新
我更多地研究了堆栈溢出,这次是正则表达式,这些问题添加到我的研究中以解决这个问题:
- This one for making the regular expression that I am looking for
- This question for checking if the expression matches the regular expression
- This question to extract a part of the
regExfor later code (my control flow) - The answer to this question that makes characters with special meaning be used as regular characters by prepending them with
\\
【问题讨论】:
-
好吧,从纯 Java 的角度来看,如果你在循环中被调用,打印一次是没有意义的。解决方案是根本不打印任何内容,让调用代码而不是函数来进行打印。
-
更好的问题是“为什么函数在一个循环中被多次调用?”
-
@markspace 你能在答案中解释更多吗?
-
@markspace 它应该只打印一次,因为 print 语句是在循环中的条件下调用的。条件包含循环的计数器 (
number)。 -
顺便说一下,我强烈建议遵循 Java 命名约定:变量名和方法总是以小写字母开头。所以
ClickedNumbers应该是clickedNumbers而StringToDouble应该是stringToDouble。
标签: java regex loops parsing processing