home processing download documents tutorial python tutorial gallery source about
 チュートリアル (トピック一覧へ戻る)

配列

     単純な配列

配列は同じ型の複数のデータを保持します。 配列は型名の右側に角括弧[ ]を加えることで宣言できます。

int[] intArray = new int[5]; //array of five integers

double[] values = new double[100]; //array of hundred double

IVec[] vectors = new IVec[10]; //array of ten vectors

IPoint[] points = new IPoint[10]; //array ten points

上記のスケッチでは、各配列にはまだ要素が格納されていません。 配列に要素を挿入するには以下のスケッチのように操作します。 なお配列の長さにはlengthフィールドからアクセスします。

import processing.opengl.*;
import igeo.*;

size( 480, 360, IG.GL );

int[] intArray = new int[5]; //array of five integers
intArray[0] = 1;
intArray[1] = 2;
intArray[2] = 3;
intArray[3] = 4;
intArray[4] = 5; //Note that the last member is [4], not [5].

double[] values = new double[100]; //array of hundred double
for(int i=0; i < values.length; i++){
  values[i] = i*2.5;
}

IVec[] vectors = new IVec[10]; //array of ten vectors
for(int i=0; i < vectors.length; i++){
  vectors[i] = new IVec( -i*10, i*10, 0 );
}

IPoint[] points = new IPoint[vectors.length]; //array ten points
for(int i=0; i < points.length; i++){
  points[i] = new IPoint(vectors[i]).clr(i*0.1, 1-i*0.1, 1);
}

lengthフィールドの使い方、 特定のインデックスへの要素の参照と挿入の方法に注目してください。 配列Aのi番目の要素をNとして参照するには、"N = A[i];"と記述します。 要素Nをi番目の位置に代入するには、"A[i] = N;"と記述します。


配列の内部構造を図で確認してください。

以下のコードのようにプリント・デバッグ によって実行時の配列の要素を確認することができます。

import processing.opengl.*;
import igeo.*;

size( 480, 360, IG.GL );

int[] intArray = new int[5]; //array of five integers
intArray[0] = 1;
intArray[1] = 2;
intArray[2] = 3;
intArray[3] = 4;
intArray[4] = 5; //Note that the last member is [4], not [5].

//just checking the contents
for(int i=0; i < intArray.length; i++){
  IG.p("intArray[" + i + "] = " + intArray[i] );
}

double[] values = new double[100]; //array of hundred double
for(int i=0; i < values.length; i++){
  values[i] = i*2.5;
  //checking the contents
  IG.p("values[" + i + "] = " + values[i] );
}

IVec[] vectors = new IVec[10]; //array of ten vectors
for(int i=0; i < vectors.length; i++){
  vectors[i] = new IVec( -i*10, i*10, 0 );
  //checking the contents
  IG.p("vectors[" + i + "] = " + vectors[i] );
}

IPoint[] points = new IPoint[vectors.length]; //array ten points
for(int i=0; i < points.length; i++){
  points[i] = new IPoint(vectors[i]).clr(i*0.1, 1-i*0.1, 1);
  //checking the contents
  IG.p("points[" + i + "] = " + points[i] );
}

上記のスケッチを実行すると以下のようなメッセージが出力されます。


sketch_tutorial.setup: intArray[0] = 1
sketch_tutorial.setup: intArray[1] = 2
sketch_tutorial.setup: intArray[2] = 3
sketch_tutorial.setup: intArray[3] = 4
sketch_tutorial.setup: intArray[4] = 5
sketch_tutorial.setup: values[0] = 0.0
sketch_tutorial.setup: values[1] = 2.5
sketch_tutorial.setup: values[2] = 5.0
sketch_tutorial.setup: values[3] = 7.5
sketch_tutorial.setup: values[4] = 10.0
sketch_tutorial.setup: values[5] = 12.5
.
.
.
sketch_tutorial.setup: values[99] = 247.5
sketch_tutorial.setup: vectors[0] = (0.0,0.0,0.0)
sketch_tutorial.setup: vectors[1] = (-10.0,10.0,0.0)
sketch_tutorial.setup: vectors[2] = (-20.0,20.0,0.0)
sketch_tutorial.setup: vectors[3] = (-30.0,30.0,0.0)
sketch_tutorial.setup: vectors[4] = (-40.0,40.0,0.0)
sketch_tutorial.setup: vectors[5] = (-50.0,50.0,0.0)
.
.
.
配列の要素番号の最大値が配列長から1を減算した数であることに注目してください。 配列の要素番号はゼロ(0)から始まるため、長さNの配列の最大要素番号は(N - 1)となります。

lengthフィールドの使い方に注目してください。 或る配列の長さを別の配列の長さに適用することで、両者の長さが必ず等しくなるようにしています。

IPoint[] points = new IPoint[vectors.length];

以下では2つの配列の長さをあえて異なるものにしています。

import processing.opengl.*;
import igeo.*;

size( 480, 360, IG.GL );

IVec[] vectors = new IVec[10]; //array of ten vectors
for(int i=0; i < vectors.length; i++){
  vectors[i] = new IVec( -i*10, i*10, 0 );
}

IPoint[] points = new IPoint[11];
for(int i=0; i < points.length; i++){
  points[i] = new IPoint(vectors[i]).clr(i*0.1, 1-i*0.1, 1);
}

長さ9の配列の10番目の要素を参照したため、 "ArrayIndexOutOfBoundsExecption"のメッセージと共に実行時エラーが発生します。


     Null値

配列のデータ型が"int"などのプリミティブ値である際、 要素は0などの値で初期化されます。ただし、データ型がクラスである際、 その配列のすべての要素はnullによって初期化されます。 nullは実体のない参照であるため、初期化後に正常な要素を格納されていない 配列の要素を操作するとエラーが発生します。

import processing.opengl.*;
import igeo.*;

size( 480, 360, IG.GL );

IPoint[] points = new IPoint[3];

// printing the content of the variable.
IG.p("points[0]="+points[0]);

// this will crash the execution of the code.
points[0].clr(1.,0,0); 

nullの操作は上記の画像のように"NullPointerException"を発生させます。

このようなエラーは配列操作に限らず、オブジェクトの代入が行われていない変数の操作によっても発生します。

import processing.opengl.*;
import igeo.*;

size( 480, 360, IG.GL );

IPoint pt;

// this will cause an error.
pt.clr(1.,0,0); 

上記のような場合は"The local variable pt may not have been initialized"というエラーメッセージが出力されます。


     2次元配列

2次元配列は配列を格納する配列を意味します。 2次元配列はデータとして2次元空間を表現することができます。 2次元配列を宣言するには、角括弧をもうひとつ加え、 [ ][ ]のようにします。

import processing.opengl.*;
import igeo.*;

size( 480, 360, IG.GL );

int[][] matrix = new int[3][2];
// initialize contents with int
matrix[0][0] = 1;
matrix[0][1] = 2;
matrix[1][0] = 3;
matrix[1][1] = 4;
matrix[2][0] = 5;
matrix[2][1] = 6;

double[][] zValues = new double[10][10];
// initialize contents with double
for(int i=0; i < zValues.length; i++){
  for(int j=0; j < zValues[i].length; j++){
    zValues[i][j] = i*2 - j*3;
  }
}

IVec[][] controlPoints = 
  new IVec[zValues.length][zValues[0].length];
// initialize contents with IVec
for(int i=0; i < controlPoints.length; i++){
  for(int j=0; j < controlPoints[i].length; j++){
    controlPoints[i][j] = new IVec(i*10,j*10,zValues[i][j]);
  }
}

IPoint[][] points = 
  new IPoint[controlPoints.length][controlPoints[0].length];
// initialize contents with IPoint
for(int i=0; i < points.length; i++){
  for(int j=0; j < points[i].length; j++){
    points[i][j] =
      new IPoint(controlPoints[i][j]).clr(0.5,i*0.1,j*0.1);
  }
}

二次元配列の構造を図で確認します。 外側の配列の長さを求めるには、通常通りlengthフィールドを参照します。
内側の配列の長さを求めるには、外側の配列から要素番号により配列を参照し、 さらにそのlengthフィールドを参照します("M[i].length")。 また内側の各配列の長さは異なりえることに注意してください。


     3次元配列

2次元配列と同様に、3次元配列を宣言することもできます。 3次元配列を宣言するには、角括弧を更にもうひとつ加えて[ ][ ][ ]のように3つ置きます。

import processing.opengl.*;
import igeo.*;

size( 480, 360, IG.GL );

int[][][] matrix3 = new int[3][2][2];
// initialize contents with int
matrix3[0][0][0] = 1;
matrix3[0][0][1] = 2;
matrix3[0][1][0] = 3;
matrix3[0][1][1] = 4;
matrix3[1][0][0] = 5;
matrix3[1][0][1] = 6;
matrix3[1][1][0] = 7;
matrix3[1][1][1] = 8;
matrix3[2][0][0] = 9;
matrix3[2][0][1] = 10;
matrix3[2][1][0] = 11;
matrix3[2][1][1] = 12;

double[][][] zShift = new double[10][10][10];
// initialize contents with double
for(int i=0; i < zShift.length; i++){
  for(int j=0; j < zShift[i].length; j++){
    for(int k=0; k < zShift[i][j].length; k++){
      zShift[i][j][k] = (i + j) * k;
    }
  }
}

IVec[][][] controlPoints = 
  new IVec[zShift.length][zShift[0].length][zShift[0][0].length];
// initialize contents with IVec
for(int i=0; i < controlPoints.length; i++){
  for(int j=0; j < controlPoints[i].length; j++){
    for(int k=0; k < controlPoints[i][j].length; k++){
      controlPoints[i][j][k] =
        new IVec(i*10,j*10,k*10 + zShift[i][j][k]);
    }
  }
}

IPoint[][][] points = 
  new IPoint[controlPoints.length][controlPoints[0].length][controlPoints[0][0].length];
// initialize contents with IPoint
for(int i=0; i < points.length; i++){
  for(int j=0; j < points[i].length; j++){
    for(int k=0; k < points[i][j].length; k++){
      points[i][j][k] =
        new IPoint(controlPoints[i][j][k])
          .clr(i*0.1,j*0.1,k*0.1);
    }
  }
}

3次元配列の構造を図で確認します。
2次元配列と同様に、最内側の配列の長さには外側の配列と中側の配列の要素番号に加えて lengthフィールドから参照します("M[i][j].length")。






(トピック一覧へ戻る)

HOME
FOR PROCESSING
DOWNLOAD
DOCUMENTS
TUTORIALS (Java / Python)
GALLERY
SOURCE CODE(GitHub)
PRIVACY POLICY
ABOUT/CONTACT