开发者社区> 问答> 正文

为什么在构造函数中更改对象中的变量之一?

我已经写了3类-一种代表复数,一种代表具有复数系数的多项式,最后一种对所述多项式执行Newton-Raphson算法以求根的估计。

问题是,当我创建Newton类的实例时,它是构造函数:

public Newton(Polynomial p) {
       this.f = p;
       this.fp = this.f.derivative();
      ```

将f设置为p没问题,但是当

this.fp = this.f.derivative();

运行后,将this.f更改为this.f.derivative(); 太。

这是派生代码:

public Polynomial derivative() { ArrayList derivativeCoeff = coeff; if (derivativeCoeff.size() == 1){ return new Polynomial(); } derivativeCoeff.remove(0); for (int i = 1; i <= derivativeCoeff.size() ;i++){ derivativeCoeff.set(i-1,derivativeCoeff.get(i-1).multiply(i));

    }
    Polynomial test = new Polynomial(derivativeCoeff);
    return test;  
}
这是牛顿的主要特点:

ArrayList coeff = new ArrayList (); coeff.add(new Complex(-1.0,0.0)); coeff.add(new Complex()); coeff.add(new Complex()); coeff.add(new Complex(1.0,0.0));

    Polynomial p = new Polynomial(coeff);
    System.out.println("the polynomial being used = "+p);
    Newton n = new Newton(p);

    System.out.println("f = "+n.getF());
    System.out.println("fp = "+n.getFp());
这是我得到的输出:

the polynomial being used = (-1.0+0.0i)+(0.0+0.0i)X+(0.0+0.0i)X^2+(1.0+0.0i)X^3 f = (0.0+0.0i)+(0.0+0.0i)X+(3.0+0.0i)X^2 fp = (0.0+0.0i)+(0.0+0.0i)X+(3.0+0.0i)X^2

当f应该等于p时。

请询问是否需要更多信息或代码。我对询问SO方面的经验并不丰富,希望得到我的任何帮助。

问题来源:Stack Overflow

展开
收起
montos 2020-03-24 10:57:44 280 0
1 条回答
写回答
取消 提交回答
  • ArrayList<Complex> derivativeCoeff = coeff;
    

    不复制列表:也更新derivativeCoeff更新coeff。

    复印:

    ArrayList<Complex> derivativeCoeff = new ArrayList<>(coeff);
    

    或者,您可以在获取副本之前删除第一个元素(显然首先要检查是否为空):

    ArrayList<Complex> derivativeCoeff = new ArrayList<>(coeff.subList(1, coeff.size()));
    

    或者,您可以直接使用流复制和更新元素。

    ArrayList<Complex> derivativeCoeff =
        IntStream.rangeClosed(1, coeff.size() - 1)
            .mapToObj(i -> coeff.get(i).multiply(i))
            .collect(Collectors.toCollection(ArrayList::new));
    

    甚至

    return
        IntStream.rangeClosed(1, coeff.size() - 1)
            .mapToObj(i -> coeff.get(i).multiply(i))
            .collect(
                Collectors.collectingAndThen(
                    Collectors.toCollection(ArrayList::new)),
                    Polynomial::new));
    

    回答来源:Stack Overflow

    2020-03-24 10:59:11
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
对象的生命期管理 立即下载
建立联系方法之一 立即下载
低代码开发师(初级)实战教程 立即下载