リストの変数への参照

アニッシュShanbhag:

申し訳ありませんが漠然としたタイトルのために、うまくいけば私はここに私の質問を明確にすることができます。

私はいくつかの二次元持っList<List<Double>> myList明示1:2つのアイテム各サブリストが含まれているdoubleなど、2.0および1つdoubleの変数を。基本的に私は何をしたいの代わりに、リストにいくつかの一定の値を格納する変数は、プログラムの他の部分に変更され、リストはそれを反映しなければならないので、私は、それは変数への参照を保存したいです。ここで私は何をしたいのかの非常に単純化バージョンは次のとおりです。

import java.util.Arrays;
import java.util.List;

public class Example {

    static double apples = 10.0;

    static double oranges = 5.0;

    static List<List<Double>> myList = Arrays.asList((Arrays.asList(2.0, apples)), (Arrays.asList(2.0, oranges)));

    public static void main(String[] args) {

        apples += 3;

        oranges += 3;

        for (List<Double> list : myList) {

            // list.get(1) -= list.get(0);

            System.out.println(list.get(1) - list.get(0));

        }

    }

}

プログラムの出力は以下の通りであります:

8.0
3.0

しかし、それは次のようになります。

11.0
6.0

ためapplesorangesの両方さらに3により増加した、コメントアウト行に注目してくださいlist.get(1) -= list.get(0);私は最終的にやりたいことで指定された変数削減であるlist.get(1)ことにより、指定された量だけをlist.get(0)私は、この行のコメントを解除する場合しかし、私が取得します:

Error:(20, 25) java: unexpected type
  required: variable
  found:    value

私は、これらの問題の両方が値によるものであると考えていますapplesし、oranges一定の値ではなく、実際の変数自身への参照としてリストに格納されています。なぜなら、私のこれは、使用しているArrays.asList()作成しますかmyListそれとも、私が定義する方法に問題がありますかList<List<Double>>それとも完全に他のいくつかの問題がありますか?

任意の助けてくれてありがとう。

トラヴィス :

あなたは全体来ている主要な問題は、可変性と参照についてです。

オブジェクト変数は、その値としての基準を持っているし、必要に応じて、次に間接参照されます。代入演算子は参照ではなく、それの基礎となる値を変更します。Javaのダブルラッパークラスは不変であるので、あなたはそれの値を変更することはできません。

apples += 3;
oranges +=3;

オブジェクトのリンゴの値に3を追加しません/オレンジは、を指すのではなく、リンゴ/オレンジよりも値が3より大きいと、新しいDoubleオブジェクトを作成します。リンゴ/オレンジは、その後、各オブジェクトへの参照を割り当てられています。あなたのリストはまだ古いオブジェクトへの参照を持っています。

マルティン・サラゴサは、公共のメンバーで、非常に基本的なものを提案し、唯一のコンストラクタは次のようになりますようあなたは、ラッパークラスを作成することができます。

public class MutableDouble {
    public double value
    public MutableDouble(double iV){
        this.value = iV
    }
}

あなたは[割り当てリンゴとMutableDouble値としてオレンジ、とはapples.valueとoranges.valueフィールドを変更することができます。

また、ステファン・kとAtomicReferenceを使用することができます。以下のコメントで示唆しています。

include java.util.concurrent.atomic.AtomicReference;

その後:

AtomicReference apples = new AtomicReference(2.0);
System.out.println(apples);
apples.set((double)apples.get() + 5.0);
System.out.println(apples);

出力:

2.0
7.0

あなたは、むしろ新しいオブジェクトに変数を再割り当てするよりも、基礎となるオブジェクトを変更する場合は、あなたのコードの他の領域は、参照オブジェクトは、変更が表示されますことをことを。

減算とあなたの問題について、あなたは値に値を代入しようとしています。list.get(1)を使用すると、基本的に言っているので、ダブルを返します10.0 = 8.0これを試して:

list.set(1, list.get(1) - list.set(0));

これは、リスト内のインデックス1にある項目に減算の値を割り当てます。

おすすめ

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