【问题标题】:Return value of a function changes the original variable used to call the function automatically函数的返回值改变了用于自动调用函数的原始变量
【发布时间】:2021-09-01 12:27:26
【问题描述】:

我有一个功能,其中用户输入数字并将这些数字添加到 Arraylist。该列表被传递给另一个类进行处理,并打印出返回值。但是当返回值时,会改变原来调用类时使用的Arraylist的值。

System.out.println("NATIVE LIST : "+loN); // original value - [2,+,3]
Evaluate evaluate = new Evaluate();
if (loN.size() > 2) {
      evaluate.setR(loN);
      System.out.println(evaluate.start()); // prints 5.0
}
System.out.println(loN); // value gets changed [5.0]

评估类代码:

 public void setR(ArrayList<String> r) {
    question = r;
}

public Number start(){
    if (question.size() == 1){
        return Double.parseDouble(question.get(0));
    }else{
        test();
    }
}

private void check_pos(String c){
    if (question.contains(c)){
        pos = question.indexOf(c);
    }
}
int test(){
    try {
        String val = null;
        if (question.contains("+")) {
            check_pos("+");
            val = String.valueOf(Double.parseDouble(question.get(pos - 1)) + 
 Double.parseDouble(question.get(pos + 1)));
        }
        if (pos != question.size()-1) {
            question.set(pos - 1, val);
            question.remove(pos + 1);
            question.remove(pos);
            start();
        }
    }catch (Exception e){
        e.printStackTrace();
    }
    return 2709;
}

【问题讨论】:

标签: java android class recursion arraylist


【解决方案1】:

在您的情况下,当您尝试再次打印列表时,在处理后,它发生了变化,这是正常的。 当您将对象引用作为参数传递给方法时,这意味着您可以在被调用的方法中更改其属性。从您将原始列表的引用与变量“question”相关联的那一刻起,每次使用“question”的引用执行操作时,您都会修改原始对象的属性。 有两种方法可以解决您的问题:

  1. 您必须从原始列表开始关联一个新列表,而不是直接关联 setR 方法中的引用。例如“question = new ArrayList (r);”

  2. 修改结构以从列表开始构建树。但是,在这种情况下,您应该更改应用程序逻辑。

我的建议是让您更轻松地进行更改是使用第一个解决方案

【讨论】:

    猜你喜欢
    • 2015-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多