[Processing×Java]   配列の使いかた

この記事はプログラムの構造をProcessingを通じて理解していくための記事です。
今回は配列について書いていきます。





目次
0.配列とは
1.簡単な配列のつくりかた
2.クラスをつかった配列をつくりかた
3.要素が多い配列のつくりかた
4.配列をつかった例

#0.配列とは

##0-0. **配列は簡単にいうと**

データを一列に並べたものです。
並べ方（順番）には意味があります。
よく目にする、座標(3,10)のようなものも配列の一種です。

##0-1. **なぜ配列を使うのか**
主な理由は、
**大量のデータをまとめてあつかうことができるから。**
です。



##0-2. **配列のイメージ**

|順位|チーム|
|:------------------:|:------------------:|
|1|巨人|
|2|DeNA|
|3|広島|
|4|阪神|
|5|中日|
|6|ヤクルト|

この表はプロ野球セリーグの順位表です。
順番と要素（チーム）が結びついて一列に並んでいます。
こんなイメージです。


#1.**簡単な配列のつくりかた**



①宣言
②初期設定
③使用
という手順で、配列をつくって使っていきます。


簡単な例で見てみましょう。


```string.java
//配列の名前と長さの宣言(名前はnumbersで長さは7)
int[] numbers = new int[5];
//配列の要素の定義
numbers[0] = 2;
numbers[1] = 4;
numbers[2] = 6;
numbers[3] = 8;
numbers[4] = 10;

//配列の使用
int a = numbers[0] + numbers[4];
println(a);
```
```
12
```
このプログラムは、配列の要素(中身)を足し算して、その結果を表示するプログラムです。
手順ごとに詳しくみてみます。

###**①宣言**

```.java
//配列の名前と長さの宣言(名前はnumbersで長さは7)
int[] numbers = new int[5];
```
**Point**:宣言の方法
**データ型 [ ]　配列の名前　=　new　データ型 [　配列の長さ　]**

今回の例で説明すると
「今から配列をつくるんだけれども、その**配列の中のデータ**は整数だよ。
**配列の名前**はnumbersで、**配列の中のデータの個数**は５個にするよ！」
って感じです。

###**②初期設定**

```.java
//配列の要素の定義
numbers[0] = 2;
numbers[1] = 4;
numbers[2] = 6;
numbers[3] = 8;
numbers[4] = 10;
```
**配列に中身を入れます。**
今回は、配列の要素の中身を**個別に決める**方法です。
※要素の個数が多いと大変です。

###**③使用**

```.java
//配列の使用
int a = numbers[0] + numbers[4];
println(a);
```

配列の要素は、**配列の名前[ インデックス ]**という形で指定します。
インデックスは配列の要素の順番です。
インデックスは、0,1,2...というふうに0からはじまります。
































































#2.**クラスをつかった配列をつくりかた**

下のプログラムは、跳ねまわるボールを２つ描くプログラムです。
今回は、このプログラムを改造していきたいと思います。

```.java
//オブジェクトの宣言
Ball b1;
Ball b2;

void setup(){
  size(600,400);
  //オブジェクトを定義する
  b1 = new Ball(50,50,7,5);
  b2 = new Ball(400,50,-7,-5);
}

void draw(){
  background(255);
  //オブジェクトb1をつかう
  b1.display();
  b1.move();
  b1.edges();

  //オブジェクトb2をつかう
  b2.display();
  b2.move();
  b2.edges();
}

//クラスを定義する
class Ball{
  //使う変数(フィールド)を宣言する
  int x;
  int y;
  float xspeed;
  float yspeed;

  //Ballクラスのコンストラクタ
  Ball(int xpos,int ypos,float xvelocity,float yvelocity){
    x = xpos;
    y = ypos;
    xspeed = xvelocity;
    yspeed = yvelocity;
  }

  //ボールを表示する関数(メソッド)
  void display(){
    fill(234,159,217);
    noStroke();
    ellipse(x,y,30,30);
  }

  //ボールを動かす関数(メソッド)
  void move(){
    x += xspeed;
    y += yspeed;
  }

  //ボールを跳ね返らせる関数(メソッド)
  void edges(){
    if(x > width-15 || x < 15){
      xspeed *= -1;
    }
    if(y > height-15 || y < 15){
      yspeed *= -1;
    }
  }
}
```

##2-0.クラスから配列をつくる

Ballクラスから、配列ballsをつくります。
配列の要素(中身)は2個です。


```.java
//配列(の名前と長さ)の宣言
Ball[] balls = new Ball[2];

void setup(){
  size(600,400);
  //配列の要素を定義する
  balls[0] = new Ball(50,50,7,5);
  balls[1] = new Ball(400,50,-7,-5);

}

void draw(){
  background(255);
  //配列ballsの１つ目の要素を扱う
  balls[0].display();
  balls[0].move();
  balls[0].edges();

  ////配列ballsの２つ目の要素を扱う
  balls[1].display();
  balls[1].move();
  balls[1].edges();
}

//クラスを定義する
class Ball{
  //使う変数(フィールド)を宣言する
  int x;
  int y;
  float xspeed;
  float yspeed;

  //Ballクラスのコンストラクタ
  Ball(int xpos,int ypos,float xvelocity,float yvelocity){
    x = xpos;
    y = ypos;
    xspeed = xvelocity;
    yspeed = yvelocity;
  }

  //ボールを表示する関数(メソッド)
  void display(){
    fill(234,159,217);
    noStroke();
    ellipse(x,y,30,30);
  }

  //ボールを動かす関数(メソッド)
  void move(){
    x += xspeed;
    y += yspeed;
  }

  //ボールを跳ね返らせる関数(メソッド)
  void edges(){
    if(x > width-15 || x < 15){
      xspeed *= -1;
    }
    if(y > height-15 || y < 15){
      yspeed *= -1;
    }
  }
}
```


クラスから配列をつくる方法を詳しく見ていきます。
配列をつくる流れは、変わりません。
つまり
**①宣言**
**②初期設定**
**③使用**
という流れです。



###**①宣言**

```.java
//配列の名前と長さの宣言(名前はballsで長さは2)
Ball[] balls = new Ball[2];
```
**Point**:宣言の方法
**クラス [ ]　配列の名前　=　new　クラス [　配列の長さ　]**

今回の例で説明すると
「今から配列をつくるんだけれども、その配列は**Ballクラスをもとにしてつくる**よ。
**配列の名前**はballsで、**配列の中のデータの個数**は2個にするよ！」
って感じです。






###**②初期設定**

```.java
//配列の要素を定義する
balls[0] = new Ball(50,50,7,5);
balls[1] = new Ball(400,50,-7,-5);
```
**配列の要素を定義します。**
今回は、配列の要素の中身を**個別に決める**方法です。
※要素の個数が多いと大変です。。





###**③使用**

```.java
//配列ballsの１つ目の要素を扱う
balls[0].display();
balls[0].move();
balls[0].edges();

////配列ballsの２つ目の要素を扱う
balls[1].display();
balls[1].move();
balls[1].edges();
```

配列の要素は、**配列の名前[ インデックス ]**という形で指定します。

ところで配列の要素はオブジェクトです。
オブジェクトはクラスのフィールド(変数)やメソッド(関数)を持っています。
オブジェクトが、自身のもつフィールドやメソッドにアクセスするためには、ドット(.)を使います。
今回は、**オブジェクト.メソッド();**というかたちで使っています。


















#3.**要素が多い配列のつくりかた**

つぎは上の配列のプログラムを改造していきたいと思います。


```.java
//配列(の名前と長さ)の宣言
Ball[] balls = new Ball[20];

void setup(){
  size(600,400);
  //配列の要素を定義する
  //forループでシンプルな形でまとめます。
  for(int i = 0;i < balls.length;i++){
    balls[i] = new Ball(random(width),random(height),random(-i,i),random(-i,i));
  }
}

void draw(){
  background(255);
  //配列を使う
  //forループでシンプルな形でまとめます。
  for(int i = 0;i < balls.length;i++){
    balls[i].display();
    balls[i].move();
    balls[i].edges();
  }
}

//クラスを定義する
class Ball{
  //使う変数(フィールド)を宣言する
  int x;
  int y;
  float xspeed;
  float yspeed;

  //Ballクラスのコンストラクタ
  Ball(int xpos,int ypos,float xvelocity,float yvelocity){
    x = xpos;
    y = ypos;
    xspeed = xvelocity;
    yspeed = yvelocity;
  }

  //ボールを表示する関数(メソッド)
  void display(){
    fill(234,159,217);
    noStroke();
    ellipse(x,y,30,30);
  }

  //ボールを動かす関数(メソッド)
  void move(){
    x += xspeed;
    y += yspeed;
  }

  //ボールを跳ね返らせる関数(メソッド)
  void edges(){
    if(x > width-15 || x < 15){
      xspeed *= -1;
    }
    if(y > height-15 || y < 15){
      yspeed *= -1;
    }
  }
}
```

クラスから要素が多い配列をつくる方法を詳しく見ていきます。
配列をつくる流れは、変わりません。
つまり
**①宣言**
**②初期設定**
**③使用**
という流れです。



###**①宣言**

```.java
//配列の名前と長さの宣言(名前はballsで長さは20)
Ball[] balls = new Ball[20];
```
**Point**:宣言の方法
**クラス [ ]　配列の名前　=　new　クラス [　配列の長さ　]**



###**②初期設定**

```.java
//配列の要素を定義する
//forループでシンプルな形でまとめます。
for(int i = 0;i < balls.length;i++){
  balls[i] = new Ball(random(width),random(height),random(-i,i),random(-i,i));
}
```

個別に要素を定義するのではなくを、ループをつかって効率よく定義していきます。




###**③使用**

```.java
//配列を使う
//forループでシンプルな形でまとめます。
for(int i = 0;i < balls.length;i++){
  balls[i].display();
  balls[i].move();
  balls[i].edges();
}
```

配列の要素は、**配列の名前[ インデックス ]**という形で指定します。
個別に要素を使うのではなく、ループをつかって効率よく使っていきます。

ところで配列の要素はオブジェクトです。
オブジェクトはクラスのフィールド(変数)やメソッド(関数)を持っています。
オブジェクトが、自身のもつフィールドやメソッドにアクセスするためには、ドット(.)を使います。
今回は、**オブジェクト.メソッド();**というかたちで使っています。








#4.**配列をつかった例**

マウスをクリックするたびに、ボールが増えていくプログラムです。



```.java
//配列の宣言
Ball[] balls = new Ball[20];

//ボールの総数を変化させたいのでそのために変数をつくる
int total = 0;

void setup(){
  size(600,400);
  //配列の要素を定義する
  //forループでシンプルな形でまとめます
  for(int i = 0;i < balls.length;i++){
    balls[i] = new Ball(random(width),random(height),random(-i,i),random(-i,i));
  }
}

//マウスが押されるたびにに、ボールの数が増えていきます
void mousePressed(){
  total += 1;
}

void draw(){
  background(255);
  //配列を使う
  //forループでシンプルな形でまとめます
  //totalの数のボールが描かれます
  for(int i = 0;i < total;i++){
    balls[i].display();
    balls[i].move();
    balls[i].edges();
  }
}

//クラスを定義する
class Ball{
  //使う変数(フィールド)を宣言する
  int x;
  int y;
  float xspeed;
  float yspeed;

  //Ballクラスのコンストラクタ
  Ball(int xpos,int ypos,float xvelocity,float yvelocity){
    x = xpos;
    y = ypos;
    xspeed = xvelocity;
    yspeed = yvelocity;
  }

  //ボールを表示する関数(メソッド)
  void display(){
    fill(234,159,217);
    noStroke();
    ellipse(x,y,30,30);
  }

  //ボールを動かす関数(メソッド)
  void move(){
    x += xspeed;
    y += yspeed;
  }

  //ボールを跳ね返らせる関数(メソッド)
  void edges(){
    if(x > width-15 || x < 15){
      xspeed *= -1;
    }
    if(y > height-15 || y < 15){
      yspeed *= -1;
    }
  }
}
```














#最後に

読んでいただきありがとうございました。
より良い記事にしていくために御意見、ご指摘のほどよろしくお願いいたします。

※この記事は、ダニエルシェフマン氏のyoutube"[Coding Train](https://www.youtube.com/c/TheCodingTrain)"を参考にしています。