Ссылка на переменную в списке [дубликат]

    

На этот вопрос уже есть ответ здесь:

    

Извините за смутное название, надеюсь, я смогу прояснить свой вопрос здесь.

У меня есть некоторый двумерный 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>>? Или это вообще какая-то другая проблема?

Спасибо за любую помощь.

4 голоса | спросил Anish Shanbhag 23 J000000Monday18 2018, 22:49:44

2 ответа


0
Основные проблемы, с которыми вы сталкиваетесь, касаются изменчивости и ссылок.Переменные объекта имеют ссылку в качестве значения, а затем разыменовываются по мере необходимости.Оператор присваивания изменяет ссылку, а не значение, лежащее в ее основе.Класс Java Double wrapper является неизменным, поэтому вы не можете изменить его значение.Не добавляет 3 к значению объектов, на которые указывают яблоки /апельсины, а скорее создает новый объект Double со значением 3 больше, чем яблоки /апельсины.яблоки /апельсины затем присваиваются ссылки на соответствующие объекты.В ваших списках все еще есть ссылки на старые объекты.Вы можете создать класс-оболочку, как предложил Мартин Сарагоса, очень простой, с открытым членом, и только конструктор будет выглядеть так:Затем вы можете назначить яблоки и апельсины в качестве значений MutableDouble и изменить поля apple.value и oranges.value.Вы также можете использовать AtomicReference в качестве stephane k.предлагает в комментариях ниже.Затем:Выход:Если вы измените базовый объект, а не переназначаете переменную на новый объект, другие области вашего кода, которые ссылаются на этот объект, увидят это изменение.Что касается вашей проблемы с вычитанием, вы пытаетесь присвоить значение значению.list.get (1) возвращает double, так что вы в основном говорите ---- +: = 5 =: + ---- .Попробуй это:Это назначит значение вычитания элементу с индексом 1 в списке.
ответил Travis 23 J000000Monday18 2018, 23:20:26
0
Пример для пониманиявыход
ответил Фарид Азаев 23 J000000Monday18 2018, 23:19:39

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132