Java 为什么函数在循环中被多次调用?

Java 为什么函数在循环中被多次调用?,java,regex,loops,parsing,processing,Java,Regex,Loops,Parsing,Processing,我使用Processing开发环境制作了一个图形计算器应用程序,并合并了一个Java操作类。然后,我在主文件-calculator.pde中调用了操作类的实例当我在多个实例上有条件地调用该方法时,由于调用该方法的循环和条件,它会多次打印该方法的输出。 下面是操作的计算()方法类: 字符串计算(){ int operationIndex=userInput.indexOf(operationSymbol); ArrayList ClickedNumber=新建ArrayList(); 系统输出打印

我使用Processing开发环境制作了一个图形计算器应用程序,并合并了一个Java
操作
类。然后,我在主文件-calculator.pde中调用了
操作
类的实例当我在多个实例上有条件地调用该方法时,由于调用该方法的循环和条件,它会多次打印该方法的输出。

下面是
操作的
计算()方法
类:

字符串计算(){
int operationIndex=userInput.indexOf(operationSymbol);
ArrayList ClickedNumber=新建ArrayList();
系统输出打印项次(操作+“索引:”+操作索引);
对于(int i=0;i<操作索引;i++){
clickedNumbers.add(userInput.get(i));}
double double1=calculator.stringToDouble(String.join(“,ClickedNumber));
System.out.println(“double1:+double1”);
单击数字。清除();
int equalindex=userInput.indexOf(“=”);
对于(int i=操作索引+1;i
所有
System.out.println()
语句都依赖于方法内部的局部变量。这些内容应该只打印到控制台一次。每当用户输入操作并按下equals时,例如,如果s/he输入
15*3
,则输出:

上面,控制台输出的突出显示部分是我想要的输出

下面是调用
calculate()
方法的代码:

String[]numberStr={“1”、“2”、“3”、“4”、“5”、“6”、“7”、“8”、“9”};
Boolean pressedquals=listName.contains(“=”);
for(字符串编号:numberStr){
布尔pressedNumber=listName.contains(数字);
如果(按数字和按相等){
if(listName.contains(“+”)){
processStatement=“添加数字…”;
结果=加法。计算();
}
else if(listName.contains(“-”){
processStatement=“减去数字…”;
结果=减法。计算();
}
else if(listName.contains(“*”){
processStatement=“乘数…”;
结果=乘法。计算();
}
else if(listName.contains(“/”){
processStatement=“分割数字…”;
结果=除法。计算();
}
else if(listName.contains(“%”){
processStatement=“模块化数字…”;
结果=模数。计算();
}
else if(listName.contains(“^”)){
processStatement=“阐述数字…”;
结果=指数。计算();
}
} 
}

我不明白为什么它打印输出的次数是
userInput
ArrayList
长度的两倍。我知道问题出在
for
循环中的
按的数字
布尔值。我知道OP-on也有同样的问题,根据用户输入的长度,它会打印多次,但问题的答案并没有解释它为什么这样做

无效的研究和试验 解决这个问题的一部分是将
processStatement
变成一个变量,因为之前我只是在条件中打印它。这不起作用,因为它打印了多次。我无法对方法中的
println
语句执行此操作,因为它们依赖于方法中的变量,并且有相当多的语句。我的第二个计划是创建一个静态方法
printInfo()
,但由于变量的作用域太窄,所以这也不起作用,而且我不能在外部定义它们,因为那样做会不准确

更新 我更多地研究了堆栈溢出,这一次是正则表达式,为了解决这个问题,我的研究中增加了以下问题:


以下是一些您可能需要在代码中重新考虑的事项:

例如,请看以下代码段:

String[] numberStr = {"1", "2", "3", "4", "5", "6", "7", "8", "9"};
Boolean pressedEquals = listName.contains("=");

for(String number : numberStr) {
    Boolean pressedNumber = listName.contains(number);
    // ...
}
这里不需要这个循环。您只需验证
listName
是否包含数字、运算符,即它是否为有效表达式。然后,如果有效,只需调用
calculate()
方法即可。您还可以使用基于正则表达式的验证来强制执行特定的表达式格式

跳过该循环并在执行验证后,它将如下所示:

// Validate expression format here
// Example: <number> <operator> <number> <=>
//             1          *        5      =

final boolean isValidated = isValidExpression( /* expression */ );

if ( isValidated == true )
{
    final String op = /* get operator here */;
    switch ( op )
    {
        case "+":
            result = addition.calculate();
            break;

        case "-":
            result = subtraction.calculate();
            break;

       // ... /, *, % ...

        default:
            // ERROR: Invalid operator...
    }
}
输出:

[ 1 +  2 =] >> true
[ 3 *  5 =] >> true
[12 + 10 =] >> true
[ 33 = 25 ] >> false
[ +65  65 ] >> false
[45 666  =] >> false

下面是一个实例:

好吧,从纯Java的角度来看,如果在循环中被调用,那么只打印一次内容是没有意义的。解决方案是根本不打印任何东西,而是让调用代码而不是函数来打印。更好的问题是“为什么函数在一个循环中被多次调用?”@markspace您能在回答中解释更多吗?@markspace它应该只打印一次,因为打印语句是在循环中的条件下调用的。该条件包含循环(
number
)的计数器。顺便说一下,我强烈建议遵循Java命名约定:变量名和方法总是以小写开头。因此,
ClickedNumbers
应该是
ClickedNumbers
StringToDouble
应该是
StringToDouble
。谢谢你的回答。我查了一下,似乎validateExpression不是一个实际的方法,所以,我需要为此创建自己的函数吗?如果是,我是否只需键入
return
Error:calculator.pde:115:0:115:0:函数
[ 1 +  2 =] >> true
[ 3 *  5 =] >> true
[12 + 10 =] >> true
[ 33 = 25 ] >> false
[ +65  65 ] >> false
[45 666  =] >> false