【Java】多次元配列の要素を1つずつ取得する

■概要

多次元(1, 2, 3, 4, ・・・, N次元)の配列に対して、要素を1つずつ取得し、表示する。
また、複合的な次元の配列に対しても、要素を1つずつ取得できるようにする。

▼サンプルの多次元配列

以下に今回使用する、多次元配列を示す。

・1次元配列

[ 1, 2, 3]

・2次元配列

[
  [1, 2, 3],
  [4, 5, 6]
]

・3次元配列

[
  [
    [1, 2],
    [3, 4]
  ],
  [
    [5, 6],
    [7, 8]
  ]
]

・4次元配列

[
  [
    [
      [1, 2],
      [3, 4]
    ],
    [
      [5, 6],
      [7, 8]
    ]
  ],
  [
    [
      [9, 10],
      [11, 12]
    ],
    [
      [13, 14],
      [15, 16]
    ]
  ]
]

・多次元配列

[
  [1, 2, 3],
  [
    [4, 5],
    [
      [6],
      [7, 8]
    ]
  ],
  9
]

■フローチャート

以下に多次元の配列に対して、要素を1つずつ取得し、表示する処理のフローチャートを示す。

開始
開始
data
data
null
null
終了
終了
not null
not null
data
data
配列
配列
配列以外
配列以外
data出力
data出力
コンソール
コンソール
配列要素
配列要素
配列先頭文字出力
配列先頭文字出力
配列開始
[
配列開始 [
配列の要素数取得
配列の要素数取得
配列の要素数分繰り返し
配列の要素数分繰り返し
再帰処理
配列のi番目の要素 -> 配列 or 数値
再帰処理 配列のi番目の要素 -> 配列 or 数値
i < 要素数 -1
i < 要素数 -1
データ間文字出力
データ間文字出力

カンマ
スペース
カンマ+スペース…
true
true
false
false
配列末尾文字出力
配列末尾文字出力
配列終了
]
配列終了 ]
終了
終了
Text is not SVG – cannot display

■サンプルコード

以下に多次元の配列に対して、要素を1つずつ取得し、表示する処理とメイン処理のサンプルコードを示す。

・RecursiveMultidimensionalArraysUtil.java

package util;

import java.lang.reflect.Array;

public class RecursiveMultidimensionalArraysUtil {

  // 再帰的に多次元配列を表示するメソッド
  public static void printArray(Object data) {
    // null 判定処理
    if (data == null) {
      return;
    }

    // 配列が存在するか
    if (data.getClass().isArray()) {
      // 配列先頭文字出力
      System.out.print("[");

      // 配列の要素数
      int length = Array.getLength(data);

      // 配列の要素数分繰り返し
      for (int i = 0; i < length; i++) {

        /* 再帰処理:配列のi番目の要素(配列 or 数値)
            ex)
              data: [1, 2, 3], i: 1 -> 2
              data: [[1, 2], [3, 4]], i: 0 -> [1, 2]
         */
        printArray(Array.get(data, i));

        if (i < length - 1) {
          // データ間の場合はカンマ+スペースを挿入
          System.out.print(", ");
        }
      }

      // 配列末尾文字出力
      System.out.print("]");

    } else {
      // 配列でなければ値を表示
      System.out.print(data);
    }
  }
}

・RecursiveMultidimensionalArraysMain.java

import static util.RecursiveMultidimensionalArraysUtil.printArray;

public class RecursiveMultidimensionalArraysMain {

  public static void main(String[] args) {
    // 1次元配列
    int[] array1D = {
        1, 2, 3
    };

    // 2次元配列
    int[][] array2D = {
        {1, 2, 3},
        {4, 5, 6}
    };

    // 3次元配列
    int[][][] array3D = {
        {{1, 2}, {3, 4}},
        {{5, 6}, {7, 8}}
    };

    // 4次元配列
    int[][][][] array4D = {
        {
            {{1, 2}, {3, 4}},
            {{5, 6}, {7, 8}}
        },
        {
            {{9, 10}, {11, 12}},
            {{13, 14}, {15, 16}}
        }
    };

    // 多次元配列(不規則な多次元)
    Object jagged = new Object[]{
        new int[]{1, 2, 3},
        new Object[]{
            new int[]{4, 5},
            new int[][]{{6}, {7, 8}}
        },
        9
    };

    System.out.println("=== 1次元 ===");
    printArray(array1D);

    System.out.println("\n=== 2次元 ===");
    printArray(array2D);

    System.out.println("\n=== 3次元 ===");
    printArray(array3D);

    System.out.println("\n=== 4次元 ===");
    printArray(array4D);

    System.out.println("\n=== 多次元 ===");
    printArray(jagged);
  }
}

■実行結果

以下にメイン処理を実行した結果を示す。

=== 1次元 ===
[1, 2, 3]
=== 2次元 ===
[[1, 2, 3], [4, 5, 6]]
=== 3次元 ===
[[[1, 2], [3, 4]], [[5, 6], [7, 8]]]
=== 4次元 ===
[[[[1, 2], [3, 4]], [[5, 6], [7, 8]]], [[[9, 10], [11, 12]], [[13, 14], [15, 16]]]]
=== 多次元 ===
[[1, 2, 3], [[4, 5], [[6], [7, 8]]], 9]

コメント