Ссылка на список массивов Java - PullRequest
0 голосов
/ 14 февраля 2019

У меня есть два списка массивов, например,

List<Integer> integerList = new ArrayList<>();
integerList.add(new Integer(1));
integerList.add(new Integer(2));
integerList.add(new Integer(3));
integerList.add(new Integer(4));

ArrayList<Integer> tempTableau = new ArrayList<Integer>();
for(int i = 0; i < integerList.size(); i++) {
    if (i >= 1 && i < 4) {
        tempTableau.add(integerList.get(i));
    }
}

, чего я хотел бы добиться, если бы я что-то вроде

tempTableau.set(1, new Integer(-2));

т.е. изменил значение в одном массиве, это также должно отражатьизменение в другом массиве или

System.out.println(integerList.get(2));
System.out.println(tempTableau.get(1));

должно оба вывести -2.

1 Ответ

0 голосов
/ 14 февраля 2019

Если вы хотите, чтобы два списка были в точности одинаковыми, а изменение одного из них изменило бы другой, вы можете заставить их ссылаться на один и тот же список следующим образом: -

List<Integer> integerList = new ArrayList<>();
List<Integer> tempTableau = integerList;

Если вы хотите разные списки, тогда это невозможно сделать с помощью одного set() вызова.Вам также нужно изменить другой список.

Вы можете придумать свое собственное расширение ArrayList, которое будет принимать слушателя и вызывать его, если что-то изменится.

Обновление на основе комментариев:

Вы можете создать класс-оболочку для переноса целого числа или использовать AtomicInteger: -

List<AtomicInteger> integerList = new ArrayList<>();
List<AtomicInteger> tempTableau = new ArrayList<>();

AtomicInteger i = new AtomicInteger(50);
integerList.add(i);
tempTableau.add(i);

integerList.get(0).set(60); // change value 50 to 60 in first list
System.out.println(tempTableau.get(0).get()); // value changed in the second

Обновление на основена дальнейшие комментарии:

Если это пользовательский объект, такой как: -

public class MyCustomClass {
    private String name;
    private int age;
    // many other fields

    // constructor, getters, setters

    @Override
    public String toString() {
        return "MyCustomClass{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

Вы можете создать свою собственную обертку следующим образом: -

class Holder<T> {

    private T object;

    Holder(T object) {
        this.object = object;
    }

    T getObject() {
        return object;
    }

    void setObject(T object) {
        this.object = object;
    }
}

И затем использовать еев ваших списках: -

    List<Holder<MyCustomClass>> listOne = new ArrayList<>();
    List<Holder<MyCustomClass>> listTwo = new ArrayList<>();

    MyCustomClass obj1 = new MyCustomClass("John", 18);

    Holder<MyCustomClass> holder1 = new Holder<>(obj1);
    listOne.add(holder1);
    listTwo.add(holder1);

    MyCustomClass obj2 = new MyCustomClass("Paul", 45);
    listOne.get(0).setObject(obj2); //make holder1 hold obj2 instead of obj1 in listOne

    System.out.println(listTwo.get(0).getObject()); //listTwo prints MyCustomClass{name='Paul', age=45}
...