私は、次の配列宣言を持っていると言います。
new double[][] {new double[] {1, 2, 3}, new double[] {4,5,6}, new double[] {7,8,9}}
そして、私は非上書き細胞内の既存の内容を残して、与えられた方向に一定量だけ(シフト)配列の内容を「翻訳」したい - 例えば:
1 2 3 1 1 2
4 5 6 Shifted by +1 in x becomes: 4 4 5
7 8 9 7 7 8
1 2 3 1 2 3
4 5 6 Shifted by +1 in y becomes: 1 2 3
7 8 9 4 5 6
私はかなり簡単にSystem.arraycopyのを使用してこれらの操作を行うことができます。
DYによるシフト:
boolean b2t = dy<0; // bottom to top movement
dy = Math.abs(dy);
if (b2t)
{
System.arraycopy(a, dy, a, 0, (a.length-dy));
}
else
{
System.arraycopy(a, 0, a, dy, (a.length-dy));
}
dxだけシフトします:
boolean l2r = dx>0; // left to right movement
dx = Math.abs(dx);
for (double[] i : a)
{
if (l2r)
{
System.arraycopy(i, 0, i, dx, (i.length-dx));
}
else
{
System.arraycopy(i, dx, i, 0, (i.length-dx));
}
}
私は両方一緒に(例えばをしようとすると、興味深い挙動が来ますdx = 1 and dy = 1
)。
私は(その後DX、DY)順示さに上記のコードを使用する場合は、コピーされた配列がそれからコピーされたアレイのためのループ反復において更新されるように思えます。
例えば1..9例えば、DX = 1、DY = 1のために、私は観察の変更は次の通りです:
Orig. dy for:dx(1) dx(2) dx(3)
1 2 3 1 2 3 1 1 2 1 1 1 1 1 1
4 5 6 -> 1 2 3 -> 1 1 2 -> 1 1 1 -> 1 1 1
7 8 9 4 5 6 4 5 6 4 5 6 4 4 5
あなたが中に、見ることができるようfor
にループdx
変換、それは彼らが同じオブジェクトであるように1行目と2行目の治療です。二回変換を適用するので、 -配列の両方の時間の両方に適用します。
System.arraycopyの状態のドキュメント:
SRCおよびDEST引数が同じ配列オブジェクトを参照する場合、コピーはsrcPos +長-1を介して位置srcPosに成分が第1の長さ成分と一時配列にコピーし、一時配列の内容があった場合のように行われますdestPos +長-1先のアレイの貫通位置destPosにコピー。
換言すれば、dy
変換が行われ、上位2つの行はバックメインアレイの中次いで別一時配列にオフにコピーされ、a
しかしシフトした位置です。
コピーされるように私には思えるreference
の配列ではなく、配列自体に-何が起こっているということでしょうか?
とにかく、私はそれがDY前DXシフトを行いますので、コードを交換することで問題を解決することができます。しかし、ここで何が起こっているかを確認するために興味深いものになるだろう。私は3次元にこれを拡張したい場合、私はちょうどそれを動作させるためにそれを再配置することができませんので。
はい、それは参照がコピーされます。
二次元アレイは、実際にはその要素が配列型のオブジェクトである配列です。
したがって、System.arraycopy
あなたの場合には、内側の配列への参照を意味する(かかわらず、それらが同じ配列であるかどうかの)標的配列にコピー元の配列の要素をこれらの要素にコピー参照を、。