@Lordao

Как правильно скопировать массив в другие массивы?

Здравствуйте!

Есть три массива. В первом находится исходная матрица, во второй обнуляется верхняя часть, а в третьей нижняя часть. Но почему-то третий массив берет ссылку от второго массива и работает с ним, как это исправить?

import java.util.Arrays;
class Matrix {
	
	private static int[][] array;
	private static int[][] arrayUpper;
	private static int[][] arrayLower;

	public static void main(String args[]) {
		
		array = fillMatrix(4,4);
		System.out.println("\nОригинальная матрица:\n");
		outputMatrix(array);
		
		arrayUpper = Arrays.copyOf(array,array.length);
		
		arrayLower = Arrays.copyOf(array,array.length);
		
		zeroUpperDiagMatrix(arrayUpper);
		System.out.println("\nОбнуляем все значения выше главной диагонали:\n");
		outputMatrix(arrayUpper);

		zeroLowerDiagMatrix(arrayLower);
		System.out.println("\nОбнуляем все значения ниже главной диагонали:\n");
		outputMatrix(arrayLower);

	}

	private static int[][] fillMatrix(int raws, int cols) {
		int[][] array = new int[raws][cols];
		for (int i = 0; i<array.length;i++) {
			for (int j = 0; j<array[i].length;j++) {
				array[i][j] = (int) (Math.random()*20+1);
			}
		}
		return array;
	}

	private static void outputMatrix(int[][] array) {
		for (int i = 0; i<array.length; i++) {
			for (int j = 0; j<array[i].length; j++) {
				System.out.print(array[i][j] + "\t");
			}
			System.out.println(" ");
		}
	}

	private static void zeroUpperDiagMatrix(int[][] array) {
		for (int i = 0; i<array.length; i++) {
			for (int j = i; j<array[i].length; j++) {
				array[i][j] = 0;
			}
		}
	}

	private static void zeroLowerDiagMatrix(int[][] array) {
		for (int i = 0; i<array.length; i++) {
			for (int j = 0; j<i; j++) {
				array[i][j] = 0;
			}
		}

		for (int i = 0; i<array.length; i++) {
			for (int j = 0; j<array[i].length; j++) {
				array[i][i] = 0;
			}
		}
	}
}
  • Вопрос задан
  • 82 просмотра
Решения вопроса 1
@ivan19631224
Метод Arrays.copyOf не делает глубокую копию массива, т.е. он не проверяет, что это не одномерный массив и копирует только первый уровень. Самое простое решение в данном случае - сделать свой метод который делает то что вам надо, например
private static int[][] deepCopy(int[][] original) {
      int[][] result = new int[original.length][];
      for (int i = 0; i < original.length; i++)
        result[i] = Arrays.copyOf(original[i], original[i].length);
      return result;
  }
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы