对不起,标题模糊,希望我在这里可以更清楚地说明问题。
我有一些二维的List<List<Double>> myList
,每个子列表包含两个项目:一个显式double
(例如2.0
)和一个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>>
的方式有问题?还是总共有其他问题?
谢谢您的帮助。
答案 0 :(得分:2)
您遇到的主要问题是关于可变性和引用。
对象变量将引用作为其值,然后根据需要取消引用。赋值运算符更改引用,而不更改其基础的值。 Java Double包装器类是不可变的,因此您无法更改其值。
apples += 3;
oranges +=3;
不向apples / oranges指向的对象的值加3,而是创建一个新的Double对象,其值比apples / oranges大3。然后为苹果/橙子分配了对各个对象的引用。您的列表仍然引用了旧对象。
您可以创建一个包装器类,如MartínZaragoza所建议的,这是一个非常基本的类,具有一个公共成员,并且只有一个构造函数如下所示:
public class MutableDouble {
public double value
public MutableDouble(double iV){
this.value = iV
}
}
然后您可以将apples和oranges分配为MutableDouble值,并更改apples.value和oranges.value字段。
您还可以将AtomicReference用作stephane k。建议在下面的评论。
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)返回一个double,因此您基本上是在说10.0 = 8.0
。
试试这个:
list.set(1, list.get(1) - list.set(0));
这会将减法的值分配给列表中索引1处的项目。
答案 1 :(得分:1)
理解示例
public static void main( String[] args ) {
class testClass {
int b;
@Override
public String toString() {
return "testClass{" +
"b=" + b +
'}';
}
}
List<Double> d = new ArrayList<>();
Double dd = new Double("2.0");
d.add(dd);
System.out.println(d.toString());
dd = 3.0;
System.out.println(d.toString());
List<testClass> tList = new ArrayList<>();
testClass t = new testClass();
t.b =1;
tList.add(t);
System.out.println(tList.toString());
t.b=2;
System.out.println(tList.toString());
}
输出
[2.0]
[2.0]
[testClass{b=1}]
[testClass{b=2}]