Обновление элементов массива Array в ArrayList - PullRequest
0 голосов
/ 14 апреля 2020

В моем коде ниже я сохраняю массив current в ArrayList of Arrays, и какие изменения, внесенные в массив current , отражаются обратно в ArrayList одновременно? как это происходит? Но в блоке else, когда я инициализирую текущий массив другим массивом, он не изменяется в ArrayList.

List<int[]> res=new ArrayList<>();
    int[] current=intervals[0];
    res.add(current);
    for(int[] interval:intervals){
        int first=current[0];
        int second=current[1];
        int third=interval[0];
        int fourth=interval[1];
        if(second>=third){
            current[1]=Math.max(second,fourth);
        }
        else{
            current=interval;
            res.add(current);
        }
    }

Ответы [ 3 ]

1 голос
/ 14 апреля 2020

Вы должны принять во внимание, что, присваивая intervals[0] int[] current, вы фактически не создаете новый объект. Таким образом, ваше поле current указывает на тот же объект, что и intervals[0]. Поэтому, когда вы вызываете res.add(current), вы фактически добавляете массив, хранящийся в intervals[0], в Список, и любые изменения, сделанные в поле current, также будут выполняться в массиве, добавленном в Список (поскольку это один и тот же объект ). И, как показывает код, вы не вносите никаких изменений в массив в блоке else, возможно, поэтому никаких изменений не видно: P. Если вы не хотите, чтобы изменения массива отражались в списке, перед добавлением массива в список создайте новый объект массива и инициализируйте его, например, следующим образом:

int[] current = new int[intervals[0].length]
for(int i = 0; i < intervals[0].length; ++i)
   current[i] = intervals[0][i]

Для вашего второго вопроса: если ваш массив инициализирован так:

int[][] intervals = new int[size][];
for(int i = 0; i < size; ++i)
   intervals[i] = new int[size2];

, это означает, что вы создали новый массив (новый объект) внутри каждой ячейки массива. Сейчас же. Этот код:

int[] current=intervals[0];

Заставляет вашу переменную current указывать на тот же объект, что и intervals[0]. Поэтому, когда вы вызываете res.add(current);, вы добавляете объект current, указывающий на список. Таким образом, любые изменения, сделанные в current или intervals[0], также будут отражены в объекте, сохраненном в списке, потому что это тот же объект. Но когда вы затем назначаете другой объект current, когда вы вызываете current = interval;, вы просто говорите, что current теперь указывает на тот же объект, что и interval. Это не меняет атрибуты исходного объекта, на который current указывал (intervals[0]), текущий будет просто указывать на другой объект.

0 голосов
/ 14 апреля 2020

Поскольку вы уже добавили intervals[0] к res, ваш l oop должен начинаться с индекса 1. Кроме того, current следует добавить к res в любом случае (if или else) - не так ли? Если да, он не должен быть внутри else части. Сделайте это следующим образом:

List<int[]> res = new ArrayList<>();
int[] current = intervals[0];
res.add(current);
for(int i=1; i < intervals.length; i++) {
    int first = current[0];
    int second = current[1];
    int third = intervals[i][0];
    int fourth = intervals[i][1];
    if(second >= third) {
        current[1] = Math.max(second,fourth);
    } else {
        current = intervals[i];           
    }
    res.add(current);
}
0 голосов
/ 14 апреля 2020

Полный пример вашей программы может помочь ответить на вторую часть вашего вопроса. Центральная точка - ссылка на указатель, а отставка current влияет на вторую часть вашего вопроса.

Массив - это указатель на память, в которой находятся "целые числа". Сначала, когда вы добавляете интервалы [0] в список res, фактически вы вставляете адрес указателя в ту же память. Когда вы переключаете / меняете значения на текущие, они отражаются в res, потому что они указывают на одну и ту же память. Вы можете думать на current[1]=Math.max(second,fourth); как: получить адресную память массива и изменить ее значение в позиции 1. В этот момент предыдущее значение в res обновляется, потому что адрес тот же. Вы можете думать, что это псевдоним, они действуют как улицы, ведущие к одной цели.

...