今回の記事では配列について解説していきます。
配列を使用することでたくさんのデータを一つの変数にまとめられます。
前回の記事:
配列(Array)とは
配列とは同じ型を持つ値を一つの変数にまとめた参照型の値になります。
C#では配列のようにたくさんのデータを表すものをコレクションと読んでいます。
配列型の変数の宣言、初期化の仕方は次のものになります。要素数は配列のサイズになります。
- 宣言:
<型名> [] <変数名> = new <型名>[<要素数>];
- 初期化:
<型名> [] <変数名> = new <型名>[<要素数>] { <要素>, ... };
初期化の際は後に書く値の数から判断できるため要素数を省略することができます。
また、一度作成した配列のサイズは変更できないので注意してください。
配列の要素にアクセスする時は次のように書きます。
- 要素からデータを取り出す時:
var a = <配列名>[<添字>];
- 要素にデータを設定する時:
<配列名>[<添字>] = <値>;
添字(Index)とは配列の中のデータに割り振られた番号になり、プログラミング言語では広く使われている用語になります。。
添字は「0から配列のサイズ-1」の範囲をとる番号になります。
また、次のメンバを使用することで配列のサイズを取得することができます。
Length
:配列のサイズを表している。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
int[] a = new int[3]; //添字は0から始まる a[0] = 0; a[1] = a[0] + 1; a[2] = a[1] + a[0]; //<- 添字2が配列aの末尾のデータ var size = a.Length; //Lengthで配列のサイズを取得できる。 //初期化の時は要素数を省略することができる。 string[] b = new string[] { // <- 要素数3になる "abc", "def", "ghi", }; |
なお、配列の要素外の添字を指定するとSystem.OutOfRangeException
という例外が発生します。
1 2 3 4 5 6 7 |
int a = new int[2]; try { a[3] = 0; // <- 例外発生 a[-1] = 0; // <- 例外発生 } catch (System.OutOfRangeException e) { // } |
多次元配列について
配列には2つ以上の添字を指定できる多次元配列というものも存在しています。
基本的な使い方は配列と同じですが、多次元配列を使用する時は角括弧([]
)の中を使用したい次元の数だけカンマ(,
)で区切ってください。
- 2次元配列:
<型名>[ , ] <変数名> = new <型名>[<1次元目のサイズ>,<2次元目のサイズ>];
- 3次元配列:
<型名>[ , , ] <変数名> = new <型名>[<1次元目のサイズ>,<2次元目のサイズ>,<3次元目のサイズ>];
- などなど
多次元配列のサイズは宣言時に指定した各次元のサイズを全て掛けた数になります。
例えば次の多次元配列のサイズはこうなります。
- int[,] a = new int[2, 4] なら 総サイズは2 * 4 = 8になる。
- int[,,] a = new int[3, 2, 5] なら 総サイズは3 * 2 * 5 = 30になる。
多次元配列の情報は次のメンバを利用すると取得することができます。
Length
:総サイズ数。Rank
:持っている次元数。GetLength(int <次元番号>)
:指定した次元のサイズ。番号は0から始まります。
(Lengthは既に説明していますが、ここで紹介しているメンバも普通の配列で使うことができます。)
1 2 3 4 5 6 7 8 9 10 11 12 |
int[,] a = new int[2, 4] { {0, 1, 2, 3}, // <- a[0, <添字>]の要素 {4, 5, 6, 7}, // <- a[1, <添字>]の要素 }; var A = a[0, 2]; //<- A == 2 var B = a[1, 0]; //<- A == 4 var C = a[0, 0]; //<- A == 0 //各次元のサイズを所得する時はGetLength(int)メソッドを使用する var size1 = a.GetLength(0); // <- size1 == 2 var size2 = a.GetLength(1); // <- size2 == 2 |
ジャグ(Jagged)配列について
多次元配列に似たものとしてジャグ(Jagged)配列というものもあります。ジャグ配列は配列の配列になります。
多次元配列との違いは各次元に異なるサイズの配列を設定することができる点になります。
書き方としては次のようになります。角括弧([]
)を次元の数だけ書く以外は配列と同じになります。
宣言:<型名>[][]... <変数名> = new int[<要素数>][<要素数>]...;
ジャグ配列も配列や多次元配列と同じメンバを持っていますので、情報を取得したい時はそれらを使ってください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
int[][] a = new int[2][];//初めの次元のサイズのみ指定する必要がある。 //使い方は配列と同じ a[0] = new int[]{ 0, 1, 2 }; a[1] = new int[]{ 3, 4 }; //bの各次元は次のようになる // b[0] => b[0][0] => int[]{0, 1} // => b[0][1] => int[]{2} // b[1] => b[1][0] => int[]{3, 4, 5} int[][][] b = new int[][][] { new int[][] { new int[] {0, 1}, new int[] {2}, }, new int[][] { new int[] {3, 4, 5}, }, }; |
繰り返し処理と一緒に配列を使ってみよう
配列は一般的に繰り返し処理と一緒に使われることが多いです。特にfor
文は配列を扱うのに便利な繰り返し処理になります。
ここであげるサンプルコードは全て同じ意味のコードになりますので、書き方の違いに注目してください。
for文の場合
for
文の場合はループカウンター関係の処理をfor
文の中に書くことができます。
1 2 3 4 5 6 7 |
int[] a = new int[] { 0, 1, 2, 3, 4, 5 }; //配列aの全ての要素を*2する繰り返し処理 //a.Lengthはaの要素数を表しているプロパティになる for(int i=0; i < a.Length; ++i) { a[i] = a[i] * 2; } |
while文の場合
while
文の場合はループカウンターをwhile
文の外に書く必要があり、必ず繰り返し処理の末尾でカウンター変数を+1してください。
1 2 3 4 5 6 7 |
int[] a = new int[] { 0, 1, 2, 3, 4, 5 }; int i=0; //ループカウンターはwhile文の外に書く while (i < a.Length){ a[i] = a[i] * 2; ++i; } |
foreach文の場合
配列はforeach
文でも使うことができます。その際は値をそのまま使用することになるため、現在どの添字のデータなのか判断できません。これはforeach
文自体がそのような性質の繰り返し処理なため、添字も一緒に使いたい時はfor文を使うといいでしょう。
1 2 3 4 5 6 7 |
int[] a = new int[] { 0, 1, 2, 3, 4, 5 }; //繰り返し処理自体は上のサンプルコードと同じ // refをつけると要素の値を変更することができる。 foreach(ref int e in a) { e *= 2; } |
Unityで使ってみよう!
それでは実際にUnity上で配列を使用してみましょう!
今回のサンプルコードではObjectsというUnityEngine.Transform
型の配列を用意し、その中に設定したGameObjectを横一列に整列させるものになります。
まず、以下の内容のコンポーネントを作成していください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
using UnityEngine; public class UseArray : MonoBehaviour { public Transform[] Objects; public float Range = 1f; void Start() { //Range分の距離をとるように整列させる繰り返し処理 for(int i=0; i<Objects.Length; ++i ) { var pos = Vector3.zero; pos.x = i * Range; Objects[i].position = pos; } } } |
コンパイルが成功しますと、UseArrayコンポーネントが使用することができますので、適当なGameObjectにアタッチしてください。
その後、Objectsにシーン中に存在するGameObejctを好きな個数分設定してください。(設定方法はInspectorからでも、ドラッグ&ドロップでも好きな方で大丈夫です。)
設定し終えましたら再生ボタンを押し実際にアプリを実行してみましょう!問題がなければ、画像のように横一列にGameObjectが整列されるはずです。
もし、隣とめり込んでいた場合はRangeの値を大きくして調節してください。
まとめ
今回の記事では配列についてみてきました。今回の記事をまとめると次のようになります。
- 配列は指定した数の同じ型の変数を集めたもの
- C#では配列のようにたくさんのデータを表すものをコレクションと呼んでおり、配列は全てのコレクション型の基礎になっている。
- 配列の中のデータにアクセスする時は添字という番号で指定する。
- 添字の範囲は0から要素数-1になり、その範囲外の番号を使うと例外が発生する。
- 一度、作成した配列のサイズは変更できない。
- 添字を複数持つ多次元配列というものがある。
- Jagged配列は各次元に異なる要素数を持つことができる多次元配列。
今回は以上になります。それでは次の記事に進みましょう!
次回の記事:
コメント