申し訳ありませんが漠然としたタイトルのために、うまくいけば私はここに私の質問を明確にすることができます。
私はいくつかの二次元持っ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
ためapples
とoranges
の両方さらに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にある項目に減算の値を割り当てます。