引用列表中的变量

时间:2018-07-23 19:49:44

标签: java arrays list reference

对不起,标题模糊,希望我在这里可以更清楚地说明问题。

我有一些二维的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

因为applesoranges都增加了3。此外,请注意注释行list.get(1) -= list.get(0);。我最终要做的是将list.get(1)指定的变量减少list.get(0)指定的数量。但是,当我取消注释此行时,我得到:

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

我认为这两个问题都是由于applesoranges的值作为常量值存储在列表中,而不是对实际变量本身的引用。这是因为我使用Arrays.asList()创建myList吗?还是我定义List<List<Double>>的方式有问题?还是总共有其他问题?

谢谢您的帮助。

2 个答案:

答案 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}]