【Java】2次元配列を90度回転させる方法まとめ|初心者向けサンプル付き解説

お疲れ様です。はるさらと申します。

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 - in - 1 - jなど、マイナス演算部分を慎重に扱いましょう。
  • 非正方形(例:3×4)配列を回転させる場合は、
    新しい配列を用意する方法を使う必要があります。
  • 2次元配列の扱いそのものに慣れていない場合は、
    まず以下の記事で基本を押さえると理解しやすいです。

関連記事:


まとめ

2次元配列を90度回転させる方法はいくつかありますが、

  • 新しい配列を作って代入する(シンプルでわかりやすい)
  • 転置+反転でその場回転(効率的で実務向き)

の2種類を理解しておけば十分です。

どちらの方法も、**「行と列をどう入れ替えるか」**がポイント。
まずは3×3などの小さい配列から試して、
仕組みをしっかり掴んでいきましょう。

どなたかのお役に立てば幸いです。
それではまたー!