1. Top
  2. Java SE
  3. 配列

配列

配列とは

複数の値をまとめて扱う場合に1~2つ程度であれば前章で説明したように変数を使用すれば問題ないとおもいます。 しかし扱うデータが100個になった場合はどうでしょう!? [ 変数を100個宣言して、] なんてしていてはとても大変です。 こんな時には通常は [ 配列 ] と呼ばれるものを使用します。

配列とは複数の変数の集合を表わします。 ただし、一つの配列を表す変数に含めることが出来るデータ型は各要素で共通でなくてはなりません。つまり、特定の要素を int型にして、別の要素を long型と言う配列は作成できません。

このように配列は複数の変数の集合になりますので、各要素へのアクセスは [要素番号] を指定します。

Javaで使用できる変数には大きく分けて、基本データ型(プリミティブ型)と、参照型の 2つの型があると言うことは前述しました。int などは 基本データ型と異なり 配列は参照型になります。 配列型変数にここの要素が格納されているように見えるかもしれませんが、ここの要素は別の領域に確保されており配列方変数にはその領域への参照が格納されています。

ページの先頭へ

配列の定義

Javaで配列を宣言する場合は、宣言時に配列であることを []をつけて明示します。
int[] i;      // 整数型の配列を宣言
int i[];      // このように記述することも可能

配列は参照型変数になるので new キーワードを使用して実体を作成します。
int[] i;          // 整数型の配列を宣言
i = new int[5];   // 0~4の要素を持つ配列を作成
i[0] = 1;         // 各要素に値を代入
i[1] = 2;
i[2] = 3;
i[3] = 4;
i[4] = 5;

// 宣言と生成を同時に実行
int[] i = new int[5];          // 宣言と初期化を同時に行う
i[0] = 1;
i[1] = 2;
i[2] = 3;
i[3] = 4;
i[4] = 5;

// 宣言と値の代入を同時に実行
int[] i = {1, 2, 3, 4, 5};     // 宣言と代入を同時に行う

配列の要素は 0から始まります。 宣言時に 5とした場合は 0~4 で 5個の要素をもつ配列を作成すると言う意味になります。 また、配列のサイズは初期化時に決定して、後で変更することができません。範囲外の要素にアクセスしてもエラーとならない言語もありますが、Javaでは例外がスローされますので注意してください。


ページの先頭へ

配列の操作

値の参照・代入

配列の各要素へのアクセスは、上記でも紹介しているように [] の中にアクセスしたい要素番号を指定する以外は通常の変数と変わりありません。

【例】値の参照・代入
public static void main(String args[]){

    int[] i = {1, 2, 3, 4, 5};

    //要素の参照 
    System.out.println("i[4] = " + i[4]);
    System.out.println("i[3] = " + i[3]);


    //値の代入 
    i[4] = 9;
    i[3] = 10;

    //要素の参照 
    System.out.println("i[4] = " + i[4]);
    System.out.println("i[3] = " + i[3]);

}

【実行結果】
i[4] = 5
i[3] = 4
i[4] = 9
i[3] = 10


要素数の取得

通常配列を使用する中で、必ずしも要素の数が決まっているという事は稀で、たいていはいくつ要素があるか分からない配列に対してプログラムを記述することが一般的です。ただしJavaでは、確保している要素外にアクセスしようとした場合、後述するような例外が発生します。

そのような場合配列の要素がいくつ在るのかを確認してから要素へアクセスをすれば例外が発生させずに済みます。プログラムを組む上で重要な事は「入力データを信用しない事」です

【例】配列の要素数を取得
public static void main(String args[]){

    int iCnt;
    int[] i = new int[10];

    System.out.println("配列の要素数は" + i.length + "です。");

    for(iCnt = 0 ; iCnt < i.length; iCnt++){
        i[iCnt]= iCnt;
    }

    for(iCnt = 0 ; iCnt < i.length; iCnt++){
        System.out.print(i[iCnt]);
        System.out.print(" ");
    }
}

【実行結果】
配列の要素数は10です。
0 1 2 3 4 5 6 7 8 9 



ページの先頭へ

配列のコピー

配列の長さ(length)

length属性は配列すべてに用意されている配列サイズを返す属性です。 length( )と言うものもありますが、これはStringオブジェクトやStringBufferオブジェクトの文字列数を返すメソッドであり、配列の属性lengthとは異なります。 length属性はしばしばforループ内で配列に何らかの処理を行いたい時などに使用します。

【例】
public static void main(String[] args) {
    int[] intArray = new int[10];
    for (int i = 0; i < intArray.length; i++) {
        intArray[i] = i * 10;
        System.out.println(intArray[i]);
    }
}

【実行結果】
0
10
20
30
40
50
60
70
80
90


配列のコピー

配列を他の配列へコピーしたいといったことがあります。ここでは配列のコピーの仕方をforループを使用した場合、cloneメソッドを使用した場合、arraycopyメソッドを使用した場合の3つに分け、それぞれ説明します。

forループで配列コピー

forループを使用し配列のコピーを行う場合は配列のlength属性を使用します。

【例】
public static void main(String[] args) {
    char[] charArray1 = {'A', 'B', 'C', 'D', 'E', 'F', 'G'}; 
    char[] charArray2 = new char[charArray1.length];

    for (int i = 0; i < charArray1.length; i++) {
        charArray2[i] = charArray1[i];
    }

    for (int i = 0; i < charArray2.length; i++) {
        System.out.println(charArray2[i]);
    }
}

【実行結果】
A
B
C
D
E
F
G


cloneメソッドで配列コピー

cloneメソッドを使用することによりある配列を別の配列へコピーすることができます。
cloneメソッドはオブジェクトのコピーを行うメソッドです。

【例】
public static void main(String[] args) {
    char[] charArray1 = {'A', 'B', 'C', 'D', 'E', 'F', 'G'};
    char[] charArray2 = (char[])charArray1.clone();

    for (int i = 0; i < charArray2.length; i++) {
        System.out.println(charArray2[i]);
    }
}

【実行結果】
A
B
C
D
E
F
G


arraycopyメソッドで配列コピー

arraycopyメソッドを使用することにより配列の範囲を指定して、別の配列へコピーすることができます。
arraycopyメソッドはSYSTEMクラスで用意されているメソッドの一つです。

【例】
public static void main(String[] args) {
    int[] FromInt = {1, 2, 3, 4, 5, 6, 7};
    int[] ToInt = new int[10];

    // FromInt配列のインデックス番号1から5インデックス分を
    // ToInt配列のインデックス番号3から順番にコピーをする
    System.arraycopy(FromInt, 1, ToInt, 3, 5);

    for (int i = 0; i < ToInt.length; i++) {
      System.out.println(ToInt[i]);
    }
}

【実行結果】
0
0   //データがコピーされていない個所は初期値である0が表示されます。
0
2   //FromInt配列のインデックス番号1のデータがコピーされています。
3
4
5
6
0
0


ページの先頭へ

多次元配列

多次元配列であっても配列と違いはないので利用する前に要素の確保が必要であり次のように記述します。

型名 配列変数名[行][列];
配列変数名 = new 型名[要素数][];


2次元配列の宣言・生成

2次元配列も1次元配列と同様に配列の宣言、宣言した配列オブジェクトに対する生成という手順をとります。2次元配列は上位配列(1次元配列)と下位配列(1次元配列の中の配列)を同時に生成することもできますし、別々に生成することもできます。上位配列と下位配列を別々に生成する場合は各回配列のサイズが同じでない場合などに使用します。

【例】上位配列と下位配列を同時に生成する場合。
int[][] int2Array = new int[10][5];
//int型の2次元配列int2Arrayを宣言・生成。
//上位配列のサイズは10、下位配列のサイズは5です。

String[][] string2Array = { {"Sunday", "Monday"},
                            {"Monday", "Tuesday"} };
//初期化子を指定して2次元配列を宣言・生成することもできます。 

【例】上位配列と下位配列を別々に生成する場合。
double[][] double2Array = new double[5][];
//double型の2次元配列double2Arrayを宣言し、上位配列のみを生成。

double2Array[0] = new double[10];
double2Array[1] = new double[8];
double2Array[2] = new double[9];
double2Array[3] = new double[8];
double2Array[4] = new double[9];
//下位配列のみを生成。


2次元配列のコピー

ここではある2次元配列を他の2次元配列へコピーする方法をforループを使用した場合とarraycopyメソッドを使用した場合のそれぞれについて説明します。


forループで配列コピー

【例】
public static void main(String[] args) {
    char[][] from2Char = { {'A', 'B', 'C', 'D', 'E'},
                           {'F', 'G', 'H', 'I', 'J'},
                           {'K', 'L', 'M', 'N', 'O'} };
    char[][] to2Char = new char[from2Char.length][];

    //forループ内でto2Charの下位配列の生成を行う。
    for(int i=0; i < from2Char.length; i++) {
        to2Char[i] = new char[from2Char[i].length];
    
        //forループ内でfrom2Charからto2Charへデータのコピーを行う。
        for (int j=0; j < from2Char[i].length; j++) {
            to2Char[i][j] = from2Char[i][j];
        }
    }

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

【実行結果】
A B C D E 
F G H I J 
K L M N O 


arraycopyメソッドで配列コピー

【例】
public static void main(String[] args) {
    String[][] from2String = { {"Japan", "Jamaica"},
                               {"UnitedStates", "Uzbekistan"},
                               {"Chile", "China", "Canada"} };
    String[][] to2String = new String[from2String.length][];

    for(int i=0; i < from2String.length; i++) {
        to2String[i] = new String[from2String[i].length];
        //該当するfrom2Stringの上位配列の要素を
        //to2Stringへコピーする。
        System.arraycopy(from2String[i], 0,
                         to2String[i], 0, from2String[i].length);
    }

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

【実行結果】
Japan Jamaica 
UnitedStates Uzbekistan 
Chile China Canada 



ページの先頭へ