なぜオブジェクト内の変数の一つは、コンストラクタ内で変更されていますか?

Deema Bowgen:

私は悪い表現の質問を謝罪 - consisely説明するのは難しいです。

複素数を表現する一つの、根の推定値を見つけると言わ多項式にニュートン・ラプソンアルゴリズムを実行するために複雑な係数と、最終的に多項式を表現する1 - 私は3つのクラスを書かれています。

問題は、私は、これはコンストラクタであることと、ニュートンクラスのインスタンスを作成するとき、次のとおりです。

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

それはときに、PにFを設定しても問題はありませんが、

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

それはthis.f.derivativeにthis.f()を変更する実行されます。あまりにも。

これは、デリバティブのコードです:

public Polynomial derivative() {
        ArrayList<Complex> 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<Complex> coeff = new ArrayList<Complex>();
        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の質問をして経験していないと私が得ることができる任意の助けをいただければ幸いです。

アンディ・ターナー:
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));

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=292803&siteId=1