【发布时间】:2015-10-31 12:01:01
【问题描述】:
我一直在尝试解决一个需要几种方法的问题:
它看起来很多,但您实际上并不需要阅读这些方法。只要知道我将int[][] 传递给一个方法,更改方法内部的int[][],然后检查方法外部的int[][] 是否相等。
public static boolean One(int[][] matrix){
matrix = transpose(matrix);
matrix = reverseRow(matrix);
return Arrays.deepEquals(matrix, changed);
}
public static boolean Two(int[][] matrix){
//180 degree clockwise
matrix = transpose(matrix);
matrix = reverseRow(matrix);
matrix = transpose(matrix);
matrix = reverseRow(matrix);
return Arrays.deepEquals(matrix,changed);
}
public static int[][] transpose(int[][] matrix){
for(int i = 0; i < N; i++) {
for(int j = i+1; j < N; j++) {
int temp = matrix[i][j];
matrix[i][j] = matrix[j][i];
matrix[j][i] = temp;
}
}
return matrix;
}
public static int[][] reverseRow(int[][] matrix){
for(int j = 0; j < N; j++){
for(int i = 0; i < N / 2; i++) {
int temp = matrix[j][i];
matrix[j][i] = matrix[j][N - i - 1];
matrix[j][N - i - 1] = temp;
}
}
return matrix;
}
public static int[][] reverseCol(int[][] matrix){
for(int col = 0;col < matrix[0].length; col++){
for(int row = 0; row < matrix.length/2; row++) {
int temp = matrix[row][col];
matrix[row][col] = matrix[matrix.length - row - 1][col];
matrix[matrix.length - row - 1][col] = temp;
}
}
return matrix;
}
问题的结构如下: 我有一个 int[][] 的原始数字 我有一个 int[][] 数字,这是原始数字转换的结果。具体来说,顺时针旋转 90 度,顺时针旋转 180 度。
实际的问题要大得多,但我认为有一条规则不允许直接解决问题,所以我将其缩减为我需要的。
问题是这样的: 在我运行方法一之后,原来的数组被修改了,所以在我运行方法二之前它已经损坏了。
例如, 方法一之前的原文:
1111
0000
0000
0000
方法一后的原文;
0001
0001
0001
0001
这些变化发生在我运行 transpose(matrix) 和 reverseRow(matrix) 之后。请注意,在 java 调试模式下,当我跨过这些方法时,我可以看到原始内容被更改。我什至没有提到原件。我修改了一个通过的原始版本。
那么,三个问题:
我认为传递给方法的对象不会更改,除非您返回更改的对象,然后将原始对象设置为 main() 中更改的对象或原始方法?我不是在谈论转置或反向行,因为它们应该改变方法一中的矩阵。
我使用字符串的方法对此进行了测试。我的上述信念是正确的。 int[][] 有区别吗?
我怎样才能修复它,以免更改原始文件?还是我错过了一些非常简单的东西?
【问题讨论】:
-
@MLProgrammer-CiM 你的意思是按值传递。
-
@MLProgrammer-CiM 这是 Java,我们的变量保存值,这些值是对对象的引用。当我们将它们传递给方法时,会创建作为原始引用副本的新引用。
-
@MLProgrammer-CiM,因此当我们试图解释 Java is pass-by-value (always) 时,人们仍然感到困惑。
-
@MLProgrammer-CiM:正确的术语反映了正确的理解。说起来:jonskeet.uk/java/parameters.html
-
@MLProgrammer-CiM - Pshemo 并不迂腐。他正在传达一个对理解 Java 至关重要但经常被误解的想法。这个想法对于理解这个问题很重要。如果您来自 C++,请将引用类型的 Java 变量视为功能更有限的指针。
标签: java methods reference parameter-passing