Java 配列

## 配列
配列とは、同じ型の複数ある値をまとめて一つとして扱うことができるもの。
同じ型の複数の値をひとつの変数として扱うことで、多くの値をまとめて扱うことが出来る。また、配列から特定の値を取り出したり、順番を入れ替えることもできる。

配列の中に格納された値は**要素**（入れ物）と呼ばれ、配列の要素は順番に並べられていて、特定の要素を書きかえたり取り出したりもできる。

## 一次元配列
同じ型の入れ物を1列に並べたものを、**1次元配列**と言う。
配列を使用するには、次の2つの手順が必要になる。
```:基本構文
型名[] 変数名;　　←①配列を表す変数を準備する（配列を宣言）
変数名　＝　new 型名[要素の数]　　←②要素(入れ物)を作成する(要素を確保する)
```
配列は、 **new** というキーワードを使って要素を確保して、初めて使用できるようになる。

```:例文(要素を5つ格納するための配列)
int[] scores;
scores = new int[5]
```
1行目では、int型の配列を表す変数scores を宣言し、2行目では、5 つ分の要素を確保したint型の配列を、変数scoresへ代入している。
これにより scores配列に5個分の値を格納するための領域を確保した。

この二行を一行にまとめる事も出来る。
```
int[] scores = new int[5];
 (配列の宜言)    (要素を確保)
```
例として、五つの要素「50、55 、70 、65 、80 」を配列の各要素に値を代入するには、次のように書く。
```
scores[O] = 50;
scores[l] = 55;
scores[2] = 70;
scores[3] = 65;
scores[4] = 80;
```
［］の中には、配列の何番目の要素であるかを示す**インデックス番号**（添え字）を指定する。インデックスは0から始まるので配列の要素の数が5の場合、0から4の値をインデックスに指定する。

```:Array.java(配列を使ったプログラムコード)
class Array {
	public static void main(String[] args) {
		int[] scores;
		scores = new int[5];
				scores[0] = 50;
				scores[1] = 60;
				scores[2] = 70;
				scores[3] = 80;
				scores[4] = 90;
		
		for(int i = 0; i < 5; i++)	{
		System.out.println(scores[i]);
		}
        System.out.println("----"); 
		System.out.println(scores[0]); 
		System.out.println(scores[3]); 
    }
 }
```
```:出力結果
50
60
70
80
90
----
50
80
```
int型の配列scoresを宣言し、scores = new int[5];で５つの要素を確保する。
インデックス番号は0から始まるので0~4までの番号をしてし、配列scoresに値を代入する。
for分を用いて各要素の値を取り出す。

インデックス番号を指定することで配列から任意の値だけを取り出す事も出来る。


## 配列の初期化
上記までは配列の宣言、領域の確保、値（初期値）の代入を順を追って行っていたがこれらの処理は次のように1 行で記述することが出来る。この処理を**配列の初期化**と呼ぶ。
```
int[] scores = {50, 55, 70, 65, 80};
データ型 [] 配列名 = {初期値1, 初期値2, 初期値3, 初期値4, 初期値5};
```
値を{}で囲み、カンマ区切りで各要素を記述する。
インデックス番号は0から始まる
配列を参照している変数に「 .lengthレングス 」とつけると、その配列に含まれる要素の数を知ることが出来る。
「配列名.length; 」で要素数を取得する。
```
int n = scores.length;
```
と記述すると、変数scores が参照している配列の要素数5が変数nに代入される。

```:Array.java(配列の初期化と要素数の取得)
class Array {
	public static void main(String[] args) {
		int[] scores = {50, 60, 70, 80, 90};
		int n = scores.length;

		for(int i = 0; i < 5; i++)	{
		System.out.println(scores[i]);
		}
　　　　　　　　　　　　　　　　System.out.println("----");
		System.out.println(n);
    }
 }
```
```:出力結果
50
60
70
80
90
----
5
```

## 2次元、 多次元配列
配列は複数の要素を使って複数の値を管理することができる。
配列の要素には数値や文字列の値だけでなく、別の配列を格納することができる。
配列の要素に別の配列が格納されているものを**2次元配列**と呼びます。

さらに配列の要素に別の 2 次元配列が格納されているものを 3 次元配列と呼び、これらを総称して**多次元配列**と呼ぶ。
同じように配列に入れ子にしていくことでさらに複雑な多次元配列も作成できる。

2次元配列を使う場合にも、配列の宜言と要素の確保が必要になる。
下記のようにすると「5つの要素を持つ配列が3つ並んだ2次元配列」になる
```
int[][] scores;　　←2次元配列の宣言
scores = new int[3][5]　←要素数５の配列が3つ並んだ2次元配列を確保
```
次のようにして初期化することが可能。
```
データ型 [][] 配列名 = {
{初期値1, 初期値2, 初期値3, 初期値4, 初期値5},
{初期値6, 初期値7, 初期値8, 初期値9, 初期値10}
};
```
```
int[][] scores = { {50, 55, 70, 65, 80},
                   {60, 77, 90, 73, 55},
                   {66, 85, 76, 95 、98 }
};
```
2次元配列の要素を参照するときには、2つのインデックスを使って参照する要素を指定する。
```
class Array {
	public static void main(String[] args) {
		int[][] scores = { {50, 55, 70, 65, 80},
                {60, 77, 90, 73, 55},
                {66, 85, 76, 95 ,98 }
         };
		    System.out.println(scores[0][0]);
			System.out.println(scores[1][2]);
			System.out.println(scores[2][4]);
		}
		
    }
```
```:出力結果
50　　←配列0番目の要素0番目
90　　←配列1番目の要素2番目
98　　←配列2番目の要素4番目
```

配列名.length; で要素数を取得する事が出来る。
さらにその配列の中の配列の長さを取得するには、
配列名[添え字（インデックス）].lengthで要素数を取得する。
```
class Array {
	public static void main(String[] args) {
		int[][] numbers = {
			      {1, 2, 3, 4, 5},
			      {6, 7, 8, 9, 10},
			      {11, 12, 13},
			      {16, 17}
			    };
	
			   System.out.println("配列の数 : " + numbers.length); 
			    System.out.println("numbers[0]の要素数 : " + numbers[0].length); 
			    System.out.println("numbers[2]の要素数 : " + numbers[2].length); 
			    System.out.println("numbers[3]の要素数 : " + numbers[3].length); 
		}
		
    }
```
```:出力結果
配列の数 : 4
numbers[0]の要素数 : 5
numbers[2]の要素数 : 3
numbers[3]の要素数 : 2
```


## インスタンスの配列化
宣言した配列にいくら値を詰めるのか、領域の確保をしてあげなければいけない。
配列インスタンスの生成の際には
・配列インスタンスの生成には必ず要素数を指定すること。
・多次元配列の場合は、変数の次元数と参照先の次元数が一致すること。
を気を付ける。

new [要素数]での確保する領域の大きさ決める。
```
Point[] points = new Point[5];
```
これで、Pointクラスのインスタンスヘの参照を格納できる要素（入れ物）が5つ確保した。
一つずつ記述すると以下になる。
```
points[0] = new Point();
points[1] = new Point();
points[2] = new Point();
points[3] = new Point();
points[4] = new Point();
```

以下は具体的な例として、points[i] (インデックスがiで指定されるPoint クラスのインスタンス）に、x = i, y = i * i の座標を設定するプログラムコード。
```
class Point{
	int x;
	int y;
}

class Array {
	public static void main(String[] args) {
		Point[] points = new Point[5];
		for(int i = 0; i < 5; i++){
			points[i] = new Point();
			points[i].x = i;
			points[i].y = i*i;
		}
		for(int i = 0; i < 5; i++ ) {
			System.out.println("points[" + i + "]の座標は(" + points[i].x + " ," + points[i].y +")");
		}
    }
 }
```
Point[] points = new Point[5];で配列を宣言。
for(int i = 0; i < 5; i++){でiが0~4の間ループさせる。
points[i] = new Point();で新しいインスタンスを作成し、xとyの値を設定する。

```:出力結果
points[0]の座標は(0 ,0)
points[1]の座標は(1 ,1)
points[2]の座標は(2 ,4)
points[3]の座標は(3 ,9)
points[4]の座標は(4 ,16)
```
14,15行目で各インスタンスの値を繰り返し出力させる。

このように5つのインスタンスの参照が配列に格納され、それぞれのインスタンスには異なる座標値を設定できた。
複数のインスタンスを管理するのに配列を使用できる。

## ArrayList
ArraListは「可変長配列」を使用するための仕組みで可変長配列とは、文字通り長さ（要素数）を変更できる配列のこと。
```:サンプルコード
import java.util.ArrayList;

class Main {
  public static void main(String[] args) {
    ArrayList<Integer> scores = new ArrayList<Integer>();

    scores.add(1);
    scores.add(5);
    scores.add(10);
    scores.add(15);

    System.out.println(scores.get(0));
    System.out.println(scores.get(1));
    System.out.println(scores.get(2));
    System.out.println(scores.get(3));
  }
}
```
```:出力結果
1
5
10
15
```
上記のコードでは、以下の４つを行なっている。
① ライブラリをインポートする
② ArrayListの宣言を行う
③ ArrayListに値を代入する
④ ArrayListから要素を取り出す

**① ライブラリをインポートする**
ArrayListを使用する際は、ライブラリのインポートが必要になりインポートするには、ファイルの冒頭に以下の記述を行う。

**② ArrayListの宣言を行う**
ArrayListの宣言と初期化は以下のように行う。
```
ArrayList<データ型> scores = new ArrayList<データ型>();
```
上記のコードでは、整数を格納するArrayListを作成したので、以下のように記述。
```
ArrayList<Integer> scores = new ArrayList<Integer>();
```
ここで行っているのは、以下の２つの動作。
① 整数（Integer）を格納するArrayListを「score」という名称で宣言
② ArrayListの要素を作成
そして、①に②を代入している。

なお、要素のデータ型を右辺でも指定していますが、これは省略することが可能で以下のように記述しても問題なく動作する。
```
ArrayList<Integer> scores = new ArrayList<>();
```

**③ ArrayListに値を代入する**
ArrayListに要素を追加するためにはaddメソッドを使用する。
記述は、add(要素として追加する値)のように行う。
以下のコードでは、scoresという名称のArrayListに「1」を追加している。
```
scores.add(1);
```
addメソッドを使用すると、要素はArrayListの**末尾に追加**されます。

**④ ArrayListから要素を取り出す**
要素を取り出す際は、getメソッドを使用している。
記述は、get(取得したい要素のインデックス） のように行い、配列から要素を取り出す際と同様に、「1番目」の要素を取り出したい時は、インデックスとして「0」を指定する。

以下のコードでは、scoresから、1番目の要素を取得している。
```
scores.get(0)
```