この記事はプログラムの構造をProcessingを通じて理解していくための記事です。
今回は配列について書いていきます。
目次
0.配列とは
1.簡単な配列のつくりかた
2.クラスをつかった配列をつくりかた
3.要素が多い配列のつくりかた
4.配列をつかった例
#0.配列とは
##0-0. 配列は簡単にいうと
データを一列に並べたものです。
並べ方(順番)には意味があります。
よく目にする、座標(3,10)のようなものも配列の一種です。
##0-1. なぜ配列を使うのか
主な理由は、
大量のデータをまとめてあつかうことができるから。
です。
##0-2. 配列のイメージ
順位 | チーム |
---|---|
1 | 巨人 |
2 | DeNA |
3 | 広島 |
4 | 阪神 |
5 | 中日 |
6 | ヤクルト |
この表はプロ野球セリーグの順位表です。
順番と要素(チーム)が結びついて一列に並んでいます。
こんなイメージです。
#1.簡単な配列のつくりかた
①宣言
②初期設定
③使用
という手順で、配列をつくって使っていきます。
簡単な例で見てみましょう。
//配列の名前と長さの宣言(名前は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
このプログラムは、配列の要素(中身)を足し算して、その結果を表示するプログラムです。
手順ごとに詳しくみてみます。
###①宣言
//配列の名前と長さの宣言(名前はnumbersで長さは7)
int[] numbers = new int[5];
Point:宣言の方法
データ型 [ ] 配列の名前 = new データ型 [ 配列の長さ ]
今回の例で説明すると
「今から配列をつくるんだけれども、その配列の中のデータは整数だよ。
配列の名前はnumbersで、配列の中のデータの個数は5個にするよ!」
って感じです。
###②初期設定
//配列の要素の定義
numbers[0] = 2;
numbers[1] = 4;
numbers[2] = 6;
numbers[3] = 8;
numbers[4] = 10;
配列に中身を入れます。
今回は、配列の要素の中身を個別に決める方法です。
※要素の個数が多いと大変です。
###③使用
//配列の使用
int a = numbers[0] + numbers[4];
println(a);
配列の要素は、**配列の名前[ インデックス ]**という形で指定します。
インデックスは配列の要素の順番です。
インデックスは、0,1,2...というふうに0からはじまります。
#2.クラスをつかった配列をつくりかた
下のプログラムは、跳ねまわるボールを2つ描くプログラムです。
今回は、このプログラムを改造していきたいと思います。
//オブジェクトの宣言
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個です。
//配列(の名前と長さ)の宣言
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の1つ目の要素を扱う
balls[0].display();
balls[0].move();
balls[0].edges();
////配列ballsの2つ目の要素を扱う
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;
}
}
}
クラスから配列をつくる方法を詳しく見ていきます。
配列をつくる流れは、変わりません。
つまり
①宣言
②初期設定
③使用
という流れです。
###①宣言
//配列の名前と長さの宣言(名前はballsで長さは2)
Ball[] balls = new Ball[2];
Point:宣言の方法
クラス [ ] 配列の名前 = new クラス [ 配列の長さ ]
今回の例で説明すると
「今から配列をつくるんだけれども、その配列はBallクラスをもとにしてつくるよ。
配列の名前はballsで、配列の中のデータの個数は2個にするよ!」
って感じです。
###②初期設定
//配列の要素を定義する
balls[0] = new Ball(50,50,7,5);
balls[1] = new Ball(400,50,-7,-5);
配列の要素を定義します。
今回は、配列の要素の中身を個別に決める方法です。
※要素の個数が多いと大変です。。
###③使用
//配列ballsの1つ目の要素を扱う
balls[0].display();
balls[0].move();
balls[0].edges();
////配列ballsの2つ目の要素を扱う
balls[1].display();
balls[1].move();
balls[1].edges();
配列の要素は、**配列の名前[ インデックス ]**という形で指定します。
ところで配列の要素はオブジェクトです。
オブジェクトはクラスのフィールド(変数)やメソッド(関数)を持っています。
オブジェクトが、自身のもつフィールドやメソッドにアクセスするためには、ドット(.)を使います。
今回は、**オブジェクト.メソッド();**というかたちで使っています。
#3.要素が多い配列のつくりかた
つぎは上の配列のプログラムを改造していきたいと思います。
//配列(の名前と長さ)の宣言
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;
}
}
}
クラスから要素が多い配列をつくる方法を詳しく見ていきます。
配列をつくる流れは、変わりません。
つまり
①宣言
②初期設定
③使用
という流れです。
###①宣言
//配列の名前と長さの宣言(名前はballsで長さは20)
Ball[] balls = new Ball[20];
Point:宣言の方法
クラス [ ] 配列の名前 = new クラス [ 配列の長さ ]
###②初期設定
//配列の要素を定義する
//forループでシンプルな形でまとめます。
for(int i = 0;i < balls.length;i++){
balls[i] = new Ball(random(width),random(height),random(-i,i),random(-i,i));
}
個別に要素を定義するのではなくを、ループをつかって効率よく定義していきます。
###③使用
//配列を使う
//forループでシンプルな形でまとめます。
for(int i = 0;i < balls.length;i++){
balls[i].display();
balls[i].move();
balls[i].edges();
}
配列の要素は、**配列の名前[ インデックス ]**という形で指定します。
個別に要素を使うのではなく、ループをつかって効率よく使っていきます。
ところで配列の要素はオブジェクトです。
オブジェクトはクラスのフィールド(変数)やメソッド(関数)を持っています。
オブジェクトが、自身のもつフィールドやメソッドにアクセスするためには、ドット(.)を使います。
今回は、**オブジェクト.メソッド();**というかたちで使っています。
#4.配列をつかった例
マウスをクリックするたびに、ボールが増えていくプログラムです。
//配列の宣言
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"を参考にしています。