JavaJava関連

【Java】様々な型の多次元配列(String,doubleなど)

Java型別多次元配列解説ページのアイキャッチ画像 Java

この記事では、Javaにおける多次元配列の様々な使用例を紹介します。int型、String型、char型、boolean型、double型、そしてObject型の多次元配列を用いた具体的なコード例とその解説をします。

int型の2次元配列

Java
public class TwoDimensionalArrayExample {
    public static void main(String[] args) {
        // 3x3の2次元配列を初期化
        int[][] matrix = {
            {1, 2, 3},
            {4, 5, 6},
            {7, 8, 9}
        };

        System.out.println("2次元配列の要素:");
        // 2次元配列の各要素にアクセスして出力
        for (int i = 0; i < matrix.length; i++) {
            for (int j = 0; j < matrix[i].length; j++) {
                // 各要素を空白区切りで出力
                System.out.print(matrix[i][j] + " ");
            }
            // 各行の終わりで改行
            System.out.println();
        }
    }
}

実行結果:

2次元配列の要素:
1 2 3 
4 5 6 
7 8 9

この例では、3×3の2次元配列を作成しています。外側のループ(i)は行を、内側のループ(j)は列を探索します。この構造は、表やグリッドの表現に適しています。

コードの解説

2次元配列の初期化:

Java
int[][] matrix = {
    {1, 2, 3},
    {4, 5, 6},
    {7, 8, 9}
};
  • matrix という名前の2次元整数配列を初期化しています。
  • この配列は3行3列の正方行列で、1から9までの整数が格納されています。
  • 各行は中括弧 {} で囲まれ、行の要素はカンマで区切られています。

配列の内容を出力:

Java
System.out.println("2次元配列の要素:");
for (int i = 0; i < matrix.length; i++) {
    for (int j = 0; j < matrix[i].length; j++) {
        System.out.print(matrix[i][j] + " ");
    }
    System.out.println();
}

この部分では、二重のfor文を使用して2次元配列の内容を出力しています:

  • 外側のループ i は行を反復します。matrix.length は行の数(この場合は3)を表します。
  • 内側のループ j は各行の列を反復します。matrix[i].length は各行の列数(この場合も3)を表します。
  • System.out.print(matrix[i][j] + " ") で各要素を空白区切りで出力します。
  • 各行の終わりで System.out.println() を呼び出して改行します。

String型の2次元配列

Java
public class NameListExample {
    public static void main(String[] args) {
        // 2次元文字列配列で名前(姓と名)を初期化
        String[][] names = {
            {"John", "Doe"},
            {"Jane", "Smith"},
            {"Bob", "Johnson"}
        };

        System.out.println("名前リスト:");
        // 拡張for文を使用して配列の各要素にアクセス
        for (String[] name : names) {
            // 姓と名を空白で区切って出力
            System.out.println(name[0] + " " + name[1]);
        }
    }
}

実行結果:

名前リスト:
John Doe
Jane Smith
Bob Johnson

この出力は、初期化された2次元配列の内容を人間が読みやすい形式で表示しています。各行は一人の人物の完全な名前(名と姓)を表しています。

このような構造は、名前のリストだけでなく、様々な種類の関連データ(例:学生の情報、商品のリストなど)を扱う際にも応用できます。また、このコードは簡単に拡張して、より多くの情報(例:ミドルネーム、年齢など)を含めることができます。

コードの解説

2次元文字列配列の初期化:

Java
String[][] names = {
    {"John", "Doe"},
    {"Jane", "Smith"},
    {"Bob", "Johnson"}
};
  • names という名前の2次元文字列配列を初期化しています。
  • この配列は3行2列の構造を持っています。
  • 各行は一人の人物を表し、最初の要素が名(first name)、2番目の要素が姓(last name)を表しています。

名前リストの出力:

Java
System.out.println("名前リスト:");
for (String[] name : names) {
    System.out.println(name[0] + " " + name[1]);
}

この部分では、拡張for文(foreach文)を使用して配列の内容を出力しています:

  • for (String[] name : names) は、names 配列の各行(各人物の名前)を反復します。
  • 各反復で、name は現在の行(1次元文字列配列)を参照します。
  • System.out.println(name + " " + name) は、各人物の名と姓を空白で区切って出力します。
  • name は名(first name)を、name は姓(last name)を参照します。

char型の2次元配列(ゲームマップの表現)

Java
public class GameMapExample {
    public static void main(String[] args) {
        // 2次元文字配列でゲームマップを初期化
        char[][] map = {
            {'#', '#', '#', '#', '#'},
            {'#', '.', '.', '.', '#'},
            {'#', '.', 'P', '.', '#'},
            {'#', '.', '.', '.', '#'},
            {'#', '#', '#', '#', '#'}
        };

        System.out.println("マップ:");
        // 拡張for文を使用してマップの各セルにアクセス
        for (char[] row : map) {
            for (char cell : row) {
                // 各セルの文字を空白区切りで出力
                System.out.print(cell + " ");
            }
            // 各行の終わりで改行
            System.out.println();
        }
    }
}

実行結果:

マップ:
# # # # # 
# . . . # 
# . P . # 
# . . . # 
# # # # #

この例は、簡単な2Dゲームマップを表現しています。’#’は壁、’.’は通路、’P’はプレイヤーの位置を示します。2次元char配列は、このような視覚的データの表現に適しています。

このような構造は、簡単なテキストベースのゲーム、迷路生成、パズルゲームなど、様々な応用が可能です。また、このコードは容易に拡張でき、例えばマップのサイズを変更したり、新しい要素(敵、アイテムなど)を追加したりすることができます。

コードの解説

2次元文字配列の初期化(ゲームマップ):

Java
char[][] map = {
    {'#', '#', '#', '#', '#'},
    {'#', '.', '.', '.', '#'},
    {'#', '.', 'P', '.', '#'},
    {'#', '.', '.', '.', '#'},
    {'#', '#', '#', '#', '#'}
};
  • map という名前の2次元文字配列を初期化しています。
  • この配列は5行5列の正方形のマップを表現しています。
  • 使用されている文字の意味:
  • '#': 壁
  • '.': 空きスペース
  • 'P': プレイヤーの位置

マップの表示:

Java
System.out.println("マップ:");
for (char[] row : map) {
    for (char cell : row) {
        System.out.print(cell + " ");
    }
    System.out.println();
}

この部分では、二重の拡張for文(foreach文)を使用してマップの内容を出力しています:

  • 外側のループ for (char[] row : map) は、map 配列の各行を反復します。
  • 内側のループ for (char cell : row) は、各行の個々のセル(文字)を反復します。
  • System.out.print(cell + " ") は、各セルの文字を空白区切りで出力します。
  • 各行の処理が終わった後、System.out.println() で改行を行い、次の行の出力準備をします。

boolean型の2次元配列(チェスボードの例)

Java
public class ChessboardExample {
    public static void main(String[] args) {
        // 8x8のboolean型2次元配列でチェスボードを初期化
        boolean[][] chessboard = new boolean[8][8];

        // チェスボードのパターンを生成
        for (int i = 0; i < 8; i++) {
            for (int j = 0; j < 8; j++) {
                // 行と列のインデックスの和が偶数の場合、trueを設定(白のマス)
                chessboard[i][j] = (i + j) % 2 == 0;
            }
        }

        System.out.println("チェスボード(true: 白, false: 黒):");
        // 拡張for文を使用してチェスボードの各マスにアクセス
        for (boolean[] row : chessboard) {
            for (boolean square : row) {
                // trueの場合は"W"(白)、falseの場合は"B"(黒)を出力
                System.out.print(square ? "W " : "B ");
            }
            // 各行の終わりで改行
            System.out.println();
        }
    }
}

実行結果:

チェスボード(true: 白, false: 黒):
W B W B W B W B 
B W B W B W B W 
W B W B W B W B 
B W B W B W B W 
W B W B W B W B 
B W B W B W B W 
W B W B W B W B 
B W B W B W B W

このような構造は、チェスゲームの実装、画像処理におけるパターン生成、その他の格子状のデータ構造を必要とするアプリケーションなど、様々な場面で応用できます。また、このコードは容易に拡張でき、例えばボードのサイズを変更したり、異なるパターンを生成したりすることができます。

boolean型の2次元配列は、このような二値的なパターンの表現に適しています。

コードの解説

チェスボードの初期化と生成:

Java
boolean[][] chessboard = new boolean[8][8];

for (int i = 0; i < 8; i++) {
    for (int j = 0; j < 8; j++) {
        chessboard[i][j] = (i + j) % 2 == 0;
    }
}
  • chessboard という名前の8×8のboolean型2次元配列を作成します。
  • 二重forループを使用して、チェスボードのパターンを生成します。
  • (i + j) % 2 == 0 の条件は、行インデックス(i)と列インデックス(j)の和が偶数の場合に true を返します。
  • これにより、交互に true(白)と false(黒)のパターンが生成されます。

チェスボードの表示:

Java
System.out.println("チェスボード(true: 白, false: 黒):");
for (boolean[] row : chessboard) {
    for (boolean square : row) {
        System.out.print(square ? "W " : "B ");
    }
    System.out.println();
}

この部分では、二重の拡張for文(foreach文)を使用してチェスボードの内容を出力しています:

  • 外側のループ for (boolean[] row : chessboard) は、chessboard 配列の各行を反復します。
  • 内側のループ for (boolean square : row) は、各行の個々のマス(boolean値)を反復します。
  • 三項演算子 square ? "W " : "B " を使用して、true の場合は “W”(白)、false の場合は “B”(黒)を出力します。
  • 各行の処理が終わった後、System.out.println() で改行を行い、次の行の出力準備をします。

double型の3次元配列(3D座標の例)

Java
public class ThreeDCoordinatesExample {
    public static void main(String[] args) {
        // 3次元double配列で3D座標を初期化
        double[][][] coordinates = {
            {{1.0, 2.0, 3.0}, {4.0, 5.0, 6.0}},
            {{7.0, 8.0, 9.0}, {10.0, 11.0, 12.0}}
        };

        System.out.println("3D座標:");
        // 3重forループを使用して3D座標の各点にアクセス
        for (int i = 0; i < coordinates.length; i++) {
            for (int j = 0; j < coordinates[i].length; j++) {
                // printf()を使用して書式化された出力を生成
                System.out.printf("点%d%d: (%.1f, %.1f, %.1f)\n", 
                    i+1, j+1, 
                    coordinates[i][j][0], 
                    coordinates[i][j][1], 
                    coordinates[i][j][2]);
            }
        }
    }
}

実行結果:

3D座標:
点11: (1.0, 2.0, 3.0)
点12: (4.0, 5.0, 6.0)
点21: (7.0, 8.0, 9.0)
点22: (10.0, 11.0, 12.0)

この出力は、4つの3D点の座標を表示しています。各点は独自の識別子(例:点11、点12など)を持ち、その後に(x, y, z)形式で座標が続きます。

このような構造は、3Dグラフィックス、科学的シミュレーション、空間データ分析など、多次元データを扱う様々なアプリケーションで応用できます。また、このコードは容易に拡張でき、例えば点の数を増やしたり、各点に追加の属性(色、サイズなど)を追加したりすることができます。

コードの解説

3次元配列の初期化(3D座標):

Java
double[][][] coordinates = {
    {{1.0, 2.0, 3.0}, {4.0, 5.0, 6.0}},
    {{7.0, 8.0, 9.0}, {10.0, 11.0, 12.0}}
};
  • coordinates という名前の3次元double配列を初期化しています。
  • この配列は2つのグループ(最外層)があり、各グループには2つの点(中間層)があり、各点は3つの座標値(x, y, z)を持っています(最内層)。
  • 合計4つの3D点が定義されています。

3D座標の表示:

Java
System.out.println("3D座標:");
for (int i = 0; i < coordinates.length; i++) {
    for (int j = 0; j < coordinates[i].length; j++) {
        System.out.printf("点%d%d: (%.1f, %.1f, %.1f)\n", 
            i+1, j+1, 
            coordinates[i][j][0], 
            coordinates[i][j][1], 
            coordinates[i][j][2]);
    }
}

この部分では、3重のforループを使用して3D座標の内容を出力しています:

  • 最外層のループ i はグループを反復します。
  • 中間層のループ j は各グループ内の点を反復します。
  • System.out.printf() を使用して、書式化された出力を生成します:
    • "点%d%d: (%.1f, %.1f, %.1f)\n" は出力の書式を定義します。
    • %d は整数を、%.1f は小数点以下1桁の浮動小数点数を表します。
  • i+1j+1 は点の番号を1から始まるように調整します。
  • coordinates[i][j] はそれぞれx、y、z座標を参照します。

Object型の2次元配列(異なる型のデータを格納)

Java
import java.time.LocalDate;

public class MixedDataArrayExample {
    public static void main(String[] args) {
        // 異なるデータ型を含む2次元Object配列を初期化
        Object[][] mixedData = {
            {1, "Apple", true},
            {2.5, 'B', new int[]{1, 2, 3}},
            {null, new StringBuilder("Hello"), LocalDate.now()}
        };

        System.out.println("混合データ型の2次元配列:");
        // 拡張for文を使用して配列の各要素にアクセス
        for (Object[] row : mixedData) {
            for (Object item : row) {
                // 各項目の値とその型を出力
                System.out.print(item + " (型: " + 
                    (item != null ? item.getClass().getSimpleName() : "null") + ") | ");
            }
            // 各行の終わりで改行
            System.out.println();
        }
    }
}

実行結果:

混合データ型の2次元配列:
1 (型: Integer) | Apple (型: String) | true (型: Boolean) | 
2.5 (型: Double) | B (型: Character) | [I@568db2f2 (型: int[]) | 
null (型: null) | Hello (型: StringBuilder) | 2024-10-28 (型: LocalDate) 

このような構造は、異なるタイプのデータを柔軟に扱う必要がある場合例:データ解析、汎用的なデータ構造の実装など)に役立ちます。ただし、型安全性が低下するため、使用には注意が必要です。実際のアプリケーションでは、可能な限り型指定されたデータ構造を使用することが推奨されます。

コードの解説

クラス定義とインポート:

Java
import java.time.LocalDate;
  • java.time.LocalDate クラスをインポートしています。これは日付を表すために使用されます。

混合データ型の2次元配列の初期化:

Java
Object[][] mixedData = {
    {1, "Apple", true},
    {2.5, 'B', new int[]{1, 2, 3}},
    {null, new StringBuilder("Hello"), LocalDate.now()}
};
  • mixedData という名前の2次元Object配列を初期化しています。
  • この配列には様々なデータ型の要素が含まれています:
    • 1行目: 整数、文字列、真偽値
    • 2行目: 浮動小数点数、文字、整数配列
    • 3行目: null、StringBuilder、LocalDate

配列の内容表示:

Java
System.out.println("混合データ型の2次元配列:");
for (Object[] row : mixedData) {
    for (Object item : row) {
        System.out.print(item + " (型: " + 
            (item != null ? item.getClass().getSimpleName() : "null") + ") | ");
    }
    System.out.println();
}

この部分では、二重の拡張for文を使用して配列の内容を出力しています:

  • 外側のループ for (Object[] row : mixedData) は各行を反復します。
  • 内側のループ for (Object item : row) は各行の項目を反復します。
  • 各項目について、以下の情報を出力します:
    • 項目の値(item
    • 三項演算子 item != null ? ... : "null" を使用して、nullチェックを行っています。
    • 項目の型(item.getClass().getSimpleName()
    • System.out.print() を使用して、各項目の情報を同じ行に出力し、| で区切っています。
  • 各行の終わりで System.out.println() を呼び出して改行します。

まとめ

  • 多様なデータ型の活用: int、String、char、boolean、double、Objectなど、様々なデータ型を用いた多次元配列の使用方法
  • 実践的な応用例: ゲームマップ、チェスボード、3D座標などに多次元配列を適用する方法
  • 異なるデータ型の組み合わせ: Object型の2次元配列を使用して、異なる型のデータを1つの配列に格納する高度な技法

これらの知識は、データ処理、ゲーム開発、科学計算など、多岐にわたるプログラミング分野で活用できます。多次元配列の適切な使用は、コードの効率性と可読性を高め、より洗練されたプログラム設計を可能にします。

未経験でもWEBスキルを取得したい方
  • Javaコース
    Javaプログラミングを基礎から応用まで、体系的に学べる実践的なカリキュラムが特徴です。「マインクラフト」を通じてJavaの基本文法とフレームワークの概念を学びます。また、実際のプロジェクト開発を通じて、データベース連携やWebアプリケーション開発のスキルを身につけることができます。

コメント

タイトルとURLをコピーしました