コツコツ学習ブログ

プログラマのweb上のメモ的なもの

配列(配列とfor文)

##配列基礎

 

```java

//配列変数の作成(宣言)

int scores;

//要素の作成と代入

scores = new int[5];

 

//配列の宣言と要素の作成、代入を同時に行う

int newScores = new int[5];

//配列の長さを調べる

System.out.print(newScores.length);

//配列の要素に値を代入

newScores[1] = 20;

//20が出力

System.out.println(newScores[1]);

```

 

##配列の初期化

変数の値を取り出す前には、必ず値を代入して初期化しなければ

コンパイルエラーが発生してしまう。

しかし配列は自動的に初期化される※下記参照

 

| intやdoubleなどの整数の型 | boolean型 | String |
| ------------------------- | --------- | ------ |
| 0 | false | null |

 

## 配列作成と初期化の省略記法

 

```java

//省略記法1

int scores = new int { 1, 2, 3, 4, 5 };

//省略記法2

int newScores = { 1, 2, 3, 4, 5 };

}

```

## forループで配列を回す

基本構文

```java

for (int i = 0; i < 配列変数名.length; i++) {

配列変数名[i]を使った処理

```

以下、配列を使用し合計と平均をループ処理で計算したサンプル

 

```java

public class Main {

publicstaticvoidmain(String args) {

 

int scores = { 20, 30, 40, 50, 60 };

int sum = 0;

for (int i = 0; i < scores.length; i++) {

sum+= scores[i];

}

int average = sum / scores.length;

System.out.println("合計点" + sum);

System.out.println("平均点" + average);

}

}

 

```

 

forループの中にif条件判定を行うサンプル

 

```java

public class Main {

publicstaticvoidmain(String args) {

 

int scores = { 20, 30, 40, 50, 60 };

int sum = 0;

int count = 0;

for (int i = 0; i < scores.length; i++) {

if (scores[i] >= 50) {

count++;

}

}

int average = sum / scores.length;

System.out.println("50点以上の科目の数は" + count);

}

```

## 2つの配列の利用

 

```java

public class Main {

publicstaticvoidmain(String args) {

int seq = new int[10];

 

for (int i = 0; i < seq.length; i++) {

//作成した配列の要素にランダムで0−3までの数字を代入

seq[i] = new java.util.Random().nextInt(4);

//配列seqに紐づく配列baseを作成

char base = { 'A', 'T', 'G', 'C' };

System.out.println(base[seq[i]]);

}

}

}

```

 

## 拡張for文

配列の要素を1つずつ取り出すループを簡単に書くための

特殊なfor文

 

```java

for (要素の型 任意の変数名 : 配列変数名) {

        処理

}

```

 

```java

public class Main {

publicstaticvoidmain(String args) {

int scores = { 20, 30, 40, 50, 60 };

for (int value : scores) {

System.out.println(value);

}

}

}

```

 

##メモリと変数

コンピュータは使用するデータをメモリに記録する。

各区画には住所(アドレス)が振られている

 

変数を宣言すると、空いている区画を変数のために確保する。

変数に値を代入するとは、確保しておいた区画に値を記録すること

 

## メモリと配列

```java

int scores = new int[5]

```

を実行した時のメモリの様子

①int型の要素を5つ持つ配列がメモリ上に作成される

②int型の配列変数scoresがメモリ上に作成される

③配列変数scoresに配列の先頭要素のアドレス代入される

⇨配列を保持する変数には、実態ではなく配列の参照先(住所)

が代入されているという事

 

### プログラムからscores[n]と指定されたら

①scoresから番地を取り出し、配列(先頭要素)を見つける

②見つけた配列の先頭要素からn個後ろの要素の区画を読み書きする。

 

## 参照と参照型

```java

public class Main {

publicstaticvoidmain(String args) {

//配列arrayAの宣言と代入

int arrayA = { 1, 2, 3 };

//配列arrayBの作成とarrayAを代入する

int arrayB = arrayA;

//arrayBの0番目に値を代入(上書き)

arrayB[0] = 100;

//参照元のarrayAの0番目を出力(100が出力される)

System.out.println(arrayA[0]);

}

}

```

上記サンプルでは、arrayAとarrayBは

同じ配列を参照している。

よってarrayBの配列変数で値を代入しても

arrayAの出力結果も100となる。

 

配列変数arrayAは「配列の実態は○○番地にあります」と指し示す

動作をしている事になる。これを参照と呼び、

メモリ上の番地を代入する変数のことを参照型変数と呼ぶ

intやbooleanなどは基本型変数といい、参照型とは区別する

 

 

```java

public class Main {

publicstaticvoidmain(String args) {

//配列arrayAの宣言と代入

int arrayA = { 1, 2, 3 };

//配列arrayBの作成とarrayAを代入する

int[] arrayB = arrayA;

//arrayBの0番目に値を代入(上書き)

arrayB[0] = 100;

//参照元のarrayAの0番目を出力(100が出力される)

System.out.println(arrayA[0]);

}

}

```