P5

配列

配列とは

変数を配列データとして定義することで、1つの変数に複数の値を保存しておくことができます。

配列データの作成

配列データの宣言や初期化は以下のように行ないます。

int[] array1;                    // int型配列の宣言
int[] array2 = new int[5];       // int型配列を宣言し、配列サイズを 5 で初期化
float[] array3 = new float[10];  // float型配列を宣言し、配列サイズを 10 で初期化
String[] array4 = new String[2]; // String型配列を宣言し、配列サイズを 2 で初期化

データ型[] 変数名;
もしくは データ型[] 変数名 = new データ型[配列サイズ];
という形式で記述します。

配列を作成し値を代入する例を以下に示します。

int[] array = new int[3]; // int型配列をサイズ 3 で初期化
array[0] = 72;
array[1] = 91;
array[2] = 83;
println( array[0] ); // 72と表示される
println( array[1] ); // 91と表示される
println( array[2] ); // 83と表示される
println( array );    // 配列の中身をまとめて表示する

array という名前で int型配列を作成し、値を3つ代入しています。値が確かに arrray に代入されていることを確認するため println() 関数を使って値を表示させています。

以下のように書くと、配列を宣言すると同時に値を直接代入することもできます。

int[] array = new int[]{ 72, 91, 83 }; // 初期値を直接代入する
println( array ); // 72, 91, 83と表示される
exit(); // プログラムを終了する

このような記法の場合、配列のサイズは書かないようにします。int[] array = new int[3]{ 72, 91, 83 }; と書くとエラーとなります(3は書かなくて良い)。

配列の宣言に関する他の例です。

int[] i_array1;
int[] i_array2 = new int[4];
float[] f_array;
String[] s_array;

void setup(){
  i_array1 = new int[]{ 1, 2 };
  i_array2[2] = 100;
  f_array = new float[]{ 1.0, 2.1, 4.2 };
  s_array = new String[]{ "Happy", "new", "year" };

  println( i_array1 ); // 1, 2 と表示される
  println();
  println( i_array2 ); // 0, 0, 100, 0と表示される
  println();
  println( f_array ); // 1.0, 2.1, 4.2 と表示される
  println();
  println( s_array ); // Happy new year と表示される

  exit(); // プログラムを終了する
}

変数をコードの冒頭で最初に宣言しています。これらの変数はグローバル変数となるので、後の関数の中で使うことができます。i_array2 はサイズ4の配列として初期化していますが、それ以外の変数は名前の宣言のみで初期化はまだしていません。setup 関数内で、それぞれの変数を初期化、または値の代入を行なっています。Processing でのプログラミングでは、変数はコードの冒頭で宣言だけを行なっておき、初期化や値の代入は setup 関数内で行なうというスタイルで書くことが一般的です。

 i_array2 の中身を見ると、3番目は 100 という値になっていますが、それ以外は 0 になっています。int型やfloat型の配列を new で初期化すると、配列内の全ての値は 0 で初期化されます。i_array2 3番目以外にはこの初期値 0 が入っているというわけです。

 引数が空のprintln関数が間に挟まっていますが、これはコンソール領域での表示を変数ごとに一行空けて見やすくするための処置です。

配列サイズの取得 .length

配列のサイズは、変数に .length を付けることで取得できます。例えばサイズが 10 の配列変数 a があった時、a.length とすることで 10 という値を得ることができます。変数の配列サイズが分からない時などに便利です。例えば以下の average という関数は int型の配列を受け取ってその配列内の数の平均値を求める関数ですが、どのようなサイズの変数が引数として代入されるかは事前にはわかりません。そこで関数内で .length を使って入力された変数のサイズを調べ、それを元に平均値を計算しています。

void setup(){
  int[] d = new int[]{ 72, 91, 83, 765 };
  float a = average( d );
  println( a );
  exit();
}

float average( int[] data ){
  float sum = 0;
  for( int i = 0; i < data.length; i++ ){
    sum += data[ i ];
  }
  return sum / data.length;
}

多次元配列

配列は上述してきたような1次元のものだけでなく、2次元や3次元以上のものも作成可能です。

int[][] array1; // 二次元配列を宣言
int[][] array2; // 二次元配列を宣言
float[][][] array3; // 三位次元配列を宣言

void setup(){
  array1 = new int[2][2]; // 2 x 2 サイズで初期化
  array1[0][0] = 10; // 配列に値を代入
  array1[1][1] = 20; // 配列に値を代入
  array2 = new int[][]{ {1, 2, 3}, {4, 5, 6} }; // 値を指定して初期化
  array3 = new float[3][3][5]; // 3 x 3 x 5 サイズで初期化
  
  println( array1[0] ); // 10,  0 と表示される
  println();
  println( array1[1] ); //  0, 20 と表示される
  println();
  println();
  println( array2[0] ); // 1, 2, 3 と表示される
  println();
  println( array2[1] ); // 4, 5, 6 と表示される
  
  exit(); // プログラムを終了する
}

多次元配列を作成するには、変数の宣言時にデータ型の横に必要な次元数だけブラケット[]を書きます。二次元配列であれば int[][]、三次元配列であれば int[][][] といった具合です。

 なお、二次元以上の配列は println 関数を使って中身をまとめて表示させることができません(上記の例だと println( array1 ); としてもきちんと中身が表示できない)。ですので println( array1[0] ); と、特定の列を指定して、つまりは1次元配列を指定して表示させています。

コメント

Copied title and URL