2011年11月22日火曜日

オブジェクト指向がわかっている人向けのProcessing(Java)の配列

前提


1.配列の宣言

Processing(Java)の配列は、実はオブジェクトだ。 だから、使うには、配列の変数を宣言して、newで配列のインスタンスを用意してそれに代入する必要がある。

たとえば、整数型で100個の要素を持った配列xを使いたければ、次のように書く。

int[] x; // 配列の変数xを宣言
x = new int[100]; // 整数型で100個の要素を持った配列のインスタンスを用意してxに代入

このように、配列の変数を宣言するには、「型[] 配列の名前」と書く。 また、インスタンスを用意して代入するには「配列の名前 = new 型[個数]」と書く。

これは、1行で書くこともできる。

int[] x = new int[100];

※Cで、同様の配列を用意するには「int x[100];」である。なお、Cの配列はオブジェクトではない。


2.配列の要素

配列の要素は0番目からはじまる。 よって、10個の要素を持った配列xを用意した場合、使えるのはx[0]〜x[9]である。


3.配列の要素の数

Processing(Java)の配列はオブジェクトなので、フィールドやメソッドを持つ。

よく使うフィールドに、配列の要素の数lengthがある。 たとえば、配列xの要素の数は、「x.length」で取得することができる。

これを使うと、整数型の要素10個持った配列xを用意して、0から9の値を代入するプログラムは、以下のように書ける。

int[] x;
x = new int[10];
for (int i = 0; i < x.length; i++) {
    x[i] = i;
}

※Cの配列はオブジェクトではないので、フィールドがない。Cの場合は、sizeof(x)/sizeof(x[0])のように、sizeof演算子を使って、「配列全体のサイズ/配列の要素1個分のサイズ」で求める。

※Cの文字列の場合、実際に入っている文字数と入れられる最大文字数は異なる。sizeof演算子で求められるのは最大文字数の方である。実際に入っている文字数はstrlen()関数で求める。また、関数を使わないで、文字列の終わりであるヌル文字「\0」が入っている位置を見つけてもいい。


4.配列の初期化

Processing(Java)の配列は、以下のように初期化することができる。

int[] x = { 31, 20, -9 };

この場合、newでインスタンスを用意するという手続きは、明確に書かない。

※Cの場合、初期化は「int x[] = { 31, 20, -9 };」でほとんど同じ。


5.配列の要素のコピー

Processing(Java)の配列は、オブジェクトであり、配列の要素のコピーを生成するメソッドclone()が用意されている。 以下のように配列yに、配列xのコピー生成して代入することができる

int[] y = x.clone();

ちなみに、事情はここで説明しないが、cloneした結果には、以下のようにキャストを行なった方が安全である。

int[] y = (int[])x.clone();

※この方法は、浅いコピーと言われているもので、ある種の場合、完全なコピーを生成してくれるわけではない。

※Cの場合、次のようにfor文などでくり返し代入する処理を書く必要がある。Processing(Java)でもこの方法は有効である。

for (i = 0; i<配列の要素数; i++) {
    y[i] = x[i];
}

Todo?

浅いコピーと深いコピー、オブジェクトを要素に持った配列、etc.

0 件のコメント: