お疲れ様です。はるさらと申します。
Javaで2次元配列(行列)を扱う中で、
「配列を90度回転させたい」という場面はよくあります。
画像処理やデータの並び替え、テトリスのようなブロック操作など、
意外と実務でも登場するテクニックです。
この記事では、2次元配列を**90度回転(時計回り・反時計回り)**させる方法を、
サンプルコード付きで丁寧に解説します。
実行結果も掲載していますので、ぜひ手を動かしながら理解を深めてください。
2次元配列の90度回転とは
2次元配列を90度回転するとは、
行と列を入れ替えて要素の位置を変えることを指します。
たとえば、以下の配列を考えます。
int[][] matrix = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
これを時計回りに90度回転させると、次のようになります。
7 4 1
8 5 2
9 6 3
つまり、「上の行」が「右の列」に、
「左の列」が「下の行」に回り込むイメージです。
この構造を理解しておくと、コードも自然に読めるようになります。
基本的な回転処理の実装例(時計回り90度)
まずは最も基本的な実装です。
新しい配列を作り、
元の行列の値を適切な位置にコピーします。
サンプルコード
public class RotateMatrix {
public static void main(String[] args) {
int[][] matrix = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
int n = matrix.length;
int[][] rotated = new int[n][n];
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
rotated[j][n - 1 - i] = matrix[i][j];
}
}
// 結果を表示
for (int[] row : rotated) {
for (int val : row) {
System.out.print(val + " ");
}
System.out.println();
}
}
}
実行結果
7 4 1
8 5 2
9 6 3
解説
rotated[j][n - 1 - i]は、「行列の転置+反転」を表しています。- 行 i → 列 j に対応付けることで、90度回転が実現されます。
n - 1 - iの部分が回転方向を制御しており、
ここを変えると「反時計回り」になります。
反時計回りに90度回転する方法
次に、反時計回りの90度回転を行うコードを紹介します。
public class RotateCounterClockwise {
public static void main(String[] args) {
int[][] matrix = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
int n = matrix.length;
int[][] rotated = new int[n][n];
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
rotated[n - 1 - j][i] = matrix[i][j];
}
}
for (int[] row : rotated) {
for (int val : row) {
System.out.print(val + " ");
}
System.out.println();
}
}
}
実行結果
3 6 9
2 5 8
1 4 7
解説
- 時計回りのときと異なり、
rotated[n - 1 - j][i]のように
インデックスを入れ替えます。 n - 1 - jの部分で反対側の列に値を移動させることで、
反時計回りの効果を得ています。
実務で使える「その場で回転」する方法(メモリ効率の高い手法)
新しい配列を作るのではなく、既存の配列内で回転させる方法もあります。
特に画像処理などで大量データを扱う場合は、この方法が有効です。
サンプルコード
public class RotateInPlace {
public static void main(String[] args) {
int[][] matrix = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
rotate(matrix);
for (int[] row : matrix) {
for (int val : row) {
System.out.print(val + " ");
}
System.out.println();
}
}
public static void rotate(int[][] matrix) {
int n = matrix.length;
// 転置
for (int i = 0; i < n; i++) {
for (int j = i; j < n; j++) {
int temp = matrix[i][j];
matrix[i][j] = matrix[j][i];
matrix[j][i] = temp;
}
}
// 各行を反転
for (int i = 0; i < n; i++) {
for (int j = 0; j < n / 2; j++) {
int temp = matrix[i][j];
matrix[i][j] = matrix[i][n - 1 - j];
matrix[i][n - 1 - j] = temp;
}
}
}
}
実行結果
7 4 1
8 5 2
9 6 3
解説
- 転置(行と列の入れ替え) → 行の反転 という2段階で回転を実現しています。
- メモリ効率が高く、
n×nの配列をそのまま使うため、追加の領域を消費しません。 - ただし、この方法は正方行列である必要があります。
よくあるミスと注意点
- 配列のインデックスを間違えると
ArrayIndexOutOfBoundsExceptionが出やすいです。n - 1 - iやn - 1 - jなど、マイナス演算部分を慎重に扱いましょう。 - 非正方形(例:3×4)配列を回転させる場合は、
新しい配列を用意する方法を使う必要があります。 - 2次元配列の扱いそのものに慣れていない場合は、
まず以下の記事で基本を押さえると理解しやすいです。
関連記事:
まとめ
2次元配列を90度回転させる方法はいくつかありますが、
- 新しい配列を作って代入する(シンプルでわかりやすい)
- 転置+反転でその場回転(効率的で実務向き)
の2種類を理解しておけば十分です。
どちらの方法も、**「行と列をどう入れ替えるか」**がポイント。
まずは3×3などの小さい配列から試して、
仕組みをしっかり掴んでいきましょう。
どなたかのお役に立てば幸いです。
それではまたー!





































