2017-02-04 4 views
0

Я попытался переместить массив, но у меня возникли проблемы.Ссылка на сдвиг массива Java

Код для сдвига массива выглядит следующим образом:

for(int i = (size - 1); i >= 0; i--) 
{ 
    data2[i+1] = data2[i]; 
} 

массива инициализации (копируется из другого массива)

obj[] data = new obj[size]; 

obj[] data2 = new obj[size + 1]; 

for(int i = 1; i <= size; i++) 
{ 
    data2[i] = data[i-1]; 
} 

data2[0] = data[0]; 

Например, если размер = 3, я только хочу, чтобы манипулировать и использовать данные для данных [1] -> данные [3]. Но, если данные для данных [0] изменяются, данные для данных [1] также меняются. Что вызывает это?

например:

данных 2 [0]: 6 ---- 1 ---- 0 ---- 0

данных 2 [1]: 6 ---- 1 ---- 0 ---- 0

данных 2 [2]: 4 ---- 8 ---- ---- 0 0

данных 2 [3]: 9 --- -5 ---- 0 ---- 0

data2[0].setElementTwo(3); 

2 данных [0]: 6 ---- 3 ---- ---- 0 0

данных 2 [1]: 6 ---- 3 ---- 0 --- -0

данных 2 [2]: 4 ---- 8 ---- ---- 0 0

данных 2 [3]: 9 ---- 5 ---- 0- --- 0

Я копирую первый массив во второй, потому что данные [] генерируются в другом классе, который генерируется из 0-> размера, в то время как мне нужна 1-> размер + 1 для этой части программа.

-edit для Ясности

полного псевдокоде:

obj[] data = new obj[size]; 

obj[] data2 = new obj[size + 1]; 

for(int i = (size - 1); i >= 0; i--) 
{ 
    data2[i+1] = data2[i]; 
} 

for(int i = 1; i <= size; i++) 
{ 
    data2[i] = data[i-1]; 
} 

data2[0] = data[0]; 

// print data2 0->3 

// change data2[0] value 

// print data2 0->3, values would have changed for data[0] and data[1] 
// but I only want to change values for data[0] and not data[1] 
+0

мутноватый от вопроса, что большинство из этих переменных были инициализируется и где кодовая последовательность управляется ими. Также четко укажите, чего вы пытаетесь достичь. – nullpointer

ответ

2

Во-первых, позвольте мне уточнить некоторые концепции. obj является ссылочным типом. Переменные ссылочных типов содержат ссылки фактическим объектам. Когда вы делаете aRefVariable = anotherRefVariable, вы не создаете новый объект. Вместо этого вы говорите, что aRefVariable должен содержать ту же ссылку, что и anotherRefVariable. В принципе, две переменные указывают на один и тот же объект после выполнения этой строки.

Проблема лежит на этой линии:

data2[i+1] = data2[i]; 

Вы говорите, что data2[i+1] должны держать ту же ссылку, как data2[i].

Чтобы упростить ситуацию, давайте предположим, что i является 0, так что линия теперь становится:

data2[1] = data2[0]; 

Как я уже сказал, второй и первый элемент data2 точек на объект же Теперь. Доступ к data2[0] в точности совпадает с data2[1] с точки зрения объекта, который вы получили.

Великий, давайте изменим объект, что первый элемент data2:

data2[0].setElementTwo(3); 

Теперь объект, который data2[0] ссылается был изменен. Когда вы пытаетесь получить доступ к data2[1], вы также видите модификацию. Зачем? Потому что data2[0] и data2[1] относятся к тому же!

Чтобы устранить эту проблему, необходимо заменить эту строку:

data2[i+1] = data2[i]; 

с чем-то вроде этого:

data2[i+1] = new obj(...); 
// you should create a new obj that has the same values as data2[i] using its constructor 
0

Нового data2 [] ссылаются на старые данных [], поэтому изменения в старом будут отражать в новом. Если вы не хотите, что использование

data[index] = new obj(data[i-1]) ; 

Это создаст новый объект, который будет в основном копия старого объекта и взаимоисключающие друг от друга.