コンテンツにスキップ

Java/基礎/配列

出典: フリー教科書『ウィキブックス(Wikibooks)』

配列

[編集]

プログラミングにおける配列(Array)は、同じデータ型の要素が連続して格納されたデータ構造です。配列は、複数の値を一つの変数に格納するために使用され、要素はインデックス(通常は0から始まる整数)によって識別されます。配列は、データの集合を表現し、効率的なデータアクセスと操作を可能にします。

配列は、以下のような特性を持ちます:

  1. 同じデータ型の要素: 配列内のすべての要素は同じデータ型である必要があります。例えば、すべての要素が整数、文字列、または浮動小数点数などの特定の型である必要があります。
  2. 連続したメモリ領域に配置される: 配列の要素はメモリ内で連続した領域に配置されます。これにより、配列内の要素は互いに隣接しているため、効率的なデータアクセスが可能になります。
  3. 要素のインデックス: 配列内の要素はインデックスによって識別されます。通常は0から始まる整数のインデックスが使用され、各要素はそのインデックスによってアクセスされます。
  4. サイズ固定: 配列は固定サイズであり、作成後に要素の数を変更することはできません。一度に格納できる要素の数が決まっています。

配列は、プログラム内で複数の値を効率的に処理するために広く使用されます。特定の要素を参照、更新、追加、削除することができ、ループ構造を使用して配列内のすべての要素を順番に処理することができます。多くのプログラミング言語で配列がサポートされており、基本的なデータ構造の一つとして広く使用されています。

Javaの配列

[編集]

Javaの配列は、同じ型の複数の要素を格納するためのデータ構造です。 配列は固定サイズであり、要素は0から始まるインデックスでアクセスされます。 Javaでは、配列はオブジェクトとして扱われます。

以下のJavaのソースコードは、配列を宣言し、初期化し、要素へのアクセス、配列の長さの取得、拡張forループの使用、配列のコピー、ソート、比較など、様々な操作を行う方法を示しています。

import java.util.Arrays;

public class ArrayQuickTour {
    public static void main(String[] args) {
        // 配列の宣言と初期化
        int[] numbers = {5, 2, 7, 1, 9};

        // 配列の要素へのアクセス
        System.out.println("First element: " + numbers[0]);

        // 配列の長さの取得
        int length = numbers.length;
        System.out.println("Array length: " + length);

        // 拡張forループを使って配列の要素にアクセス
        System.out.println("Elements:");
        for (int num : numbers) {
            System.out.println(num);
        }

        // 配列のコピー
        int[] copy = Arrays.copyOf(numbers, numbers.length);
        System.out.println("Copied array: " + Arrays.toString(copy));

        // 配列のソート
        Arrays.sort(numbers);
        System.out.println("Sorted array: " + Arrays.toString(numbers));

        // 配列の比較
        int[] numbers2 = {5, 2, 7, 1, 9};
        boolean isEqual = Arrays.equals(numbers, numbers2);
        System.out.println("Arrays are equal: " + isEqual);
    }
}

このコードでは、配列を宣言し、初期化する際に初期化リストを使用しています。そして、配列の要素へのアクセス、配列の長さの取得、拡張forループを使った要素の表示、Arrays.copyOfを使った配列のコピー、Arrays.sortを使った配列のソート、そしてArrays.equalsを使った配列の比較を行っています。

このコードは、配列を操作するための基本的な手法を示しており、これらの手法を理解することで、Javaで配列を効果的に利用することができます。

メソッド一覧

[編集]

以下は、Javaの配列で使用できる主なメソッドの一覧です。この一覧には、配列の作成、要素の操作、配列のコピー、比較、ソートなど、さまざまな操作に関連するメソッドが含まれています。

配列のメソッド一覧
メソッド 説明
copyOf() 配列のコピーを作成します。指定した長さよりも短い場合は、ゼロパディングされ、指定した長さよりも長い場合は、切り詰められます。
copyOfRange() 指定された範囲の配列のコピーを作成します。
equals() 2つの配列が同じかどうかを比較します。
fill() 配列のすべての要素を指定した値で埋めます。
sort() 配列の要素を昇順にソートします。
binarySearch() 二分探索を使用して、指定された値を配列内で検索します。ソートされている配列で使用する必要があります。
toString() 配列の内容を文字列として返します。
hashCode() 配列のハッシュコードを返します。
parallelPrefix() 並列で累積を計算し、結果を配列に格納します。
parallelSetAll() 配列のすべての要素に対して、指定された関数を並列で適用します。
parallelSort() 配列の要素を並列にソートします。
setAll() 配列のすべての要素に対して、指定された関数を適用します。
stream() 配列をストリームに変換します。
asList() 配列を固定サイズのリストに変換します。
hashCode() 配列のハッシュコードを返します。

これらのメソッドは、Javaの java.util.Arrays クラスで定義されており、配列を効果的に操作するための便利なユーティリティを提供しています。

多次元配列

[編集]

Javaにおける多次元配列(Multidimensional Array)は、配列の要素が配列である配列のことを指します。つまり、配列内に配列を持つことで、複数の次元を持つデータ構造を表現します。

たとえば、2次元配列は行と列のような2つの次元を持ちます。3次元配列は、立方体のように3つの次元を持ちます。これにより、行列、立方体、テンソルなどの構造化されたデータを効率的に表現することができます。

以下は、Javaで多次元配列を宣言および初期化する方法の例です。

// 2次元配列の宣言と初期化
int[][] twoDimArray = new int[3][4]; // 3行4列の2次元配列
twoDimArray[0][0] = 1; // (0, 0)に値を設定
twoDimArray[1][2] = 5; // (1, 2)に値を設定

// 3次元配列の宣言と初期化
int[][][] threeDimArray = new int[2][3][4]; // 2*3*4の3次元配列
threeDimArray[0][1][2] = 7; // (0, 1, 2)に値を設定
threeDimArray[1][2][3] = 9; // (1, 2, 3)に値を設定

多次元配列は、ネストされたforループを使用して要素にアクセスすることが一般的です。例えば、2次元配列の要素にアクセスするには、2つのループを使用して行と列を反復処理します。

for (int i = 0; i < twoDimArray.length; i++) {
    for (int j = 0; j < twoDimArray[i].length; j++) {
        System.out.print(twoDimArray[i][j] + " ");
    }
    System.out.println();
}

Java 5以降では、拡張forループ(enhanced for loop)またはfor-eachループと呼ばれる新しいループ形式が導入されました。これは、コレクションや配列などの反復可能なオブジェクトを簡潔に反復処理するために使用されます。

以下は、拡張forループを使用して多次元配列を反復処理する方法の例です。

// 2次元配列の反復処理
for (int[] row : twoDimArray) {
    for (int element : row) {
        System.out.print(element + " ");
    }
    System.out.println();
}

// 3次元配列の反復処理
for (int[][] plane : threeDimArray) {
    for (int[] row : plane) {
        for (int element : row) {
            System.out.print(element + " ");
        }
        System.out.println();
    }
}

この方法では、2つまたは3つのネストされたループを使用する必要がなくなり、より簡潔で読みやすいコードが得られます。各ループでは、拡張forループを使用して配列の各要素を直接取得し、それを処理することができます。

拡張forループは、配列やリストなどの反復可能なコレクションの要素を処理する場合に非常に便利です。これにより、ループの記述が簡素化され、コードの可読性が向上します。

以下は、4x4のdouble配列を宣言し、それを単位行列にするJavaのコード例です。

public class Main {
    public static void main(String[] args) {
        // 4x4のdouble配列を宣言し、単位行列に初期化する
        int size = 4;
        double[][] matrix = new double[size][size];
        
        // 単位行列に初期化する
        for (int i = 0; i < matrix.length; i++) {
            for (int j = 0; j < matrix[i].length; j++) {
                matrix[i][j] = (i == j) ? 1.0 : 0.0;
            }
        }
        
        // 行列を出力する
        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();
        }
    }
}

このコードは、4x4のdouble配列を宣言し、その要素を単位行列に初期化します。その後、単位行列を出力します。単位行列は、対角要素がすべて1で、それ以外の要素がすべて0の正方行列です。

多次元配列は、行列や画像処理など、多次元のデータを扱う際に役立ちます。