2016-03-17 3 views
0
public static void reverseArray(int[] arr) { 
    int[] reversed = new int[arr.length]; 
    for (int i = arr.length - 1; i > -1; --i) { 
     reversed[arr.length - i - 1] = arr[i]; 
    } 
    arr = reversed; 
} 

Здесь у меня есть метод обратного массива. Если я называюКопирование Java-массива и копирование 2D-массива Confused

int[] v = new int[] {1, 2, 3, 4}; 
reverseArray(v); 
//print v 

Я хотел бы получить "1 2 3 4"

Но если я изменил функцию reverseArray на

public static void reverseArray(int[] arr) { 
    int[] reversed = new int[arr.length]; 
    for (int i = arr.length - 1; i > -1; --i) { 
     reversed[arr.length - i - 1] = arr[i]; 
    } 
    for (int i = 0; i < arr.length; ++i) { 
     arr[i] = reversed[i]; 
    } 
} 

Он будет работать как задумано и распечатать «4 3 2 1 «Почему не« arr = обратный »; Работа? Они оба указателя, поэтому, если я назначаю их другим, он должен указывать на те же объекты, что и на 2D-массивы. Если я сделаю

int[][] mat = //some assignment 

public void reverseMatrix() { 
     reverseAllRows(); 
     int[][] c = new int[mat.length][mat[0].length]; 
     for (int i = 0; i < mat.length; ++i) { 
      c[mat.length - 1 - i] = mat[i]; 
     } 
     mat = c; //This works for some reason 
} 

Это работает без необходимости копировать каждый из элементов. Почему это и как я узнаю, когда это нужно, чтобы использовать равные, а когда нет?

+0

Ваша проблема в том, что Java выполняет «pass by value». Это означает, что присвоение «arr = обратное» просто не имеет эффекта вне сферы действия этого метода. Код, вызывающий обратный метод, делает ** не ** видеть новый, обратный массив. Вам когда-либо приходилось напрямую изменять элементы предоставленного массива; или вам нужно вернуть обратный массив. – GhostCat

+0

Да, но почему это сработало для 2D-массива? – user2180617

+1

Потому что для 2D-массива вы делаете что-то другое. Там ваш метод не работает на входном параметре, а в поле класса-класса! – GhostCat

ответ

1

То, что вы должны сделать, это вернуть массив, как, например:

public static int[] reverseArray(int[] arr) 
{ 
    int[] reversed = new int[arr.length]; 
    for (int i = arr.length - 1; i > -1; --i) 
    { 
     reversed[arr.length - i - 1] = arr[i]; 
    } 
    return reversed; 
} 

Затем вы вызываете функцию:

int[] v = new int[] {1, 2, 3, 4}; 
v = reverseArray(v); 
//print v 
+0

Это метод пустоты – user2180617

+0

Забыл изменить тип возврата, теперь он исправлен. Спасибо, что заметили! – Xzenon

0

Java является языком Pass-By-Value. Это причина. Когда вы передаете ссылку и присваиваете эту ссылку другому объекту, исходная ссылка вызывающего абонента не изменится. Таким образом, изменения не будут отображаться для вызывающего.