System.out.println("Before decryption:");
System.out.println(Arrays.deepToString(output));
int top, bottom;
bottom = this.size-1;
for(top = 0; top<bottom; top++,bottom--){
char[] topMatrix = output[top];
char[] bottomMatrix = output[bottom];
System.out.println(top+" "+bottom);
System.arraycopy(topMatrix, 0, output[bottom], 0, size);
System.arraycopy(bottomMatrix, 0, output[top], 0, size);
}
System.out.println("After Decryption: ");
System.out.println(Arrays.deepToString(output));
}
上面是我用来切换第一行和最后一行,然后是第二行和第二行到最后一行的代码,依此类推,直到它耗尽行以切换到2d数组。
这是输出:
Input: abcdefghi
Before decryption:
[[a, b, c], [d, e, f], [g, h, i]]
0 2
After Decryption:
[[a, b, c], [d, e, f], [a, b, c]]
所以这里似乎发生的是,arraycopy会将第一行复制到最后一行,但不知何故,bottomMatrix变量似乎更新为(abc)而不是原始(ghi)。
是什么给出的?它似乎执行第一个arraycopy然后退出循环并返回,而不是执行循环中的所有语句。
答案 0 :(得分:1)
您正在将代码复制到同一个数组中,因此当您的顶部写入底部时,它会覆盖底部,然后同样的事情被写入顶部。你将abc复制到ghi上,然后尝试将abc复制到abc。
您应该使用不同的数组进行输入和输出以避免此问题。
System.out.println("Before decryption:");
System.out.println(Arrays.deepToString(output));
int top, bottom;
bottom = this.size-1;
char[][] copy = new char[size][size];
for(top = 0; top<=bottom; top++,bottom--){
char[] topMatrix = output[top];
char[] bottomMatrix = output[bottom];
System.out.println(top+" "+bottom);
System.arraycopy(topMatrix, 0, copy[bottom], 0, size);
System.arraycopy(bottomMatrix, 0, copy[top], 0, size);
}
System.out.println("After Decryption: ");
System.out.println(Arrays.deepToString(copy));
另请注意,我已更改为&lt; =而不是&lt;,因为您正在写入新数组,因此如果您使用的是奇数大小的数组,如果仅使用&lt;,则不会复制中心行。对于偶数大小的数组,相同的条件将起作用,因为顶部&gt;下半部分被处理。
答案 1 :(得分:1)
与Java中的所有对象一样,数组就像C中的指针一样
因此char[] bottomMatrix = output[bottom];
不会复制数组,bottomMatrix
现在只引用与output[bottom]
相同的内存地址。
但如果我没有弄错,你甚至不需要复制,你可以重新分配:
for(top = 0; top<bottom; top++,bottom--){
char[] intermediate = output[top];
output[top] = output[bottom];
output[bottom] = intermediate;
}