Java 基本編 5日目

この章では配列文字列について焦点を当てて説明します

配列

配列とは「同じ型のデータを複数まとめて扱うことができるデータ構造」のことです
配列を使うと、複数の連続したデータ構造を一つの変数で管理することができます

1次元配列

同じ型の入れ物を1列に並べたものを「一次元配列」と言います

上図は配列のイメージ図です
同じ大きさの箱が連続して、各々の箱に値を入れることができます
それぞれの箱のことを要素と言います
また、各々の箱には0から始まる番号(添え字)が振られています
添え字は0から始まり配列の要素の数よりも一つ小さい値までの範囲となります
各々の箱に値を入れたり、値を参照する場合、添え字を使用して箱を特定します

配列の使い方

配列を使用するためには、次の手順が必要です
①配列変数を宣言する
配列の本体を参照する変数を準備するため、以下のように記述します

データ型[] 配列変数名;

たとえば、int型の配列を宣言する場合は、以下のように記述します

int[] a;

②要素を確保する
配列の本体を生成するため、以下のように記述します

配列変数名 = new データ型[要素数];

newnew演算子と呼ばれるもので、ここでは、指定されたデータ型の要素を[]内で指定した要素数だけ領域を作成します
int型の要素数が3の配列を作成する場合、以下のように記述します

a = new int[3];

また、①、②をまとめて以下のようにも記述できます

int [] a = new int[3];

③各要素の値を代入
配列の中身に値を代入するには、以下のように記述します

a[0] = 123;
a[1] = 456;
a[2] = 789;
[ ] の中の数字は添字で0から(要素数-1)を指定します

配列を初期化する方法は、以下のように記述する方法もあります

int[] a = {1, 2, 3}; 

④配列に入っている値を参照する
配列に入っている値を参照するには、以下のように記述します

配列変数名[n];

nは、添字で0から(要素数-1)の数字を指定します
たとえば、以下のように記述します

System.out.println("[0]=" + a[0] );
System.out.println("[1]=" + a[1] );
System.out.println("[2]=" + a[2] );

配列の要素数は次のように記述して取得できます

配列変数名.length;

前述した配列aの要素数は次のようにして取得できます

int n = a.length;

配列を使用し、ある地域の過去5日間の最高気温から平均値を計算するサンプルプログラムを以下に示します

public class Sample{
     public static void main(String []args){
        double[] degree = {26.0, 29.0,29.8,32.1,35.0};
        double sum = 0;
        double ave ;
        
        for(int i=0;i<degree.length;i++){
	        sum = sum + degree[i];
        }
        ave = sum / 5;
        System.out.println("最高気温の平均値は" + ave + "です");
     }
}
実行結果
最高気温の平均値は30.380000です

double[] degree = {26.0, 29.0,29.8,32.1,35.0};

この行で配列の初期化をしています

for(int i=0;i<degree.length;i++){
    sum = sum + degree[i];
}

for文を使用し、配列のi番目の値を取り出し、合計値を計算します
もし、過去1週間を計算する場合は、配列の初期化を変更するだけで済みます
この例のように、配列とfor文などの繰り返し処理との相性は抜群です

拡張for文

Javaでは、配列の要素を一つずつ取り出すための拡張for文が用意されていて、以下のように記述します

for(データ型 任意の変数名: 配列変数名){

}

たとえば、前述したプログラムを拡張for文で書き換えた場合、以下のように記述します

public class Sample{
     public static void main(String []args){
        double[] degree = {26.0, 29.0,29.8,32.1,35.0};
        double sum = 0;
        double ave ;
        
        for(double val : degree){
	        sum = sum + val;
        }
        ave = sum / 5;
        System.out.println("最高気温の平均値は" + ave + "です");
     }
}

ループ変数や配列の添字を記述する必要がなくすっきりとしています

配列を使う上での注意点

配列を使う際には、以下のことに注意が必要です

  • 配列のサイズは宣⾔時に決まり、その後変更することはできません
  • 配列の(要素数ー1)の値を超えてアクセスした場合、実行時にエラーとなります
    ※以下のようなコードは実⾏時にエラーとなります。
int[] array = {1, 2, 3, 4, 5};
array[5] = 10; // エラー: 配列の範囲外にアクセス

参照について

基本編2日目のときに、Javaのデータ型には基本型参照型があり、配列は参照型だと説明しました
なぜ、参照型と呼ばれているかを説明します
①配列変数を宣言する
配列を宣言した際、メモリ領域上に配列変数aが作成されます

②要素を確保
new int[3];が実行されると、指定した要素の数だけ、別のメモリ領域上に作成されます
そして、作成された先頭の要素のアドレスが配列変数aに代入されます
これにより、配列変数aは、「配列の実体は0x60番地にある」と指し示す動作をすることになり、これを参照と呼びます

多次元配列

2次元またはそれ以上の次元の配列を多次元配列と呼びます
ここでは、2次元配列の説明を行います
2次元配列の宣言は次のように記述します

データ型[][] 配列変数名 = new データ型[行数][列数];

また、配列を参照するには次のように記述します

配列変数名[行の添字][列の添字]

2行3列の配列を作成したサンプルプログラムを以下に示します

以下のコードの2次元配列を表すイメージ図です

public class Sample {
    public static void main(String[] args){
        int[][] b = {
            {0,1,2},{3,4,5}
        };
   
        System.out.println("b[0][0]=" + b[0][0]);
        System.out.println("b[0][1]=" + b[0][1]);
        System.out.println("b[0][2]=" + b[0][2]);
        System.out.println("b[1][0]=" + b[1][0]);
        System.out.println("b[1][1]=" + b[1][1]);
        System.out.println("b[1][2]=" + b[1][2]);
     }
}
【実行結果】
b[0][0]=0    //1行目
b[0][1]=1
b[0][2]=2
b[1][0]=3 //2行目 
b[1][1]=4
b[1][2]=5

2次元配列を宣言した配列変数bが参照しているイメージ図です

配列変数の代入

配列変数を別の配列変数に代入することができます
しかし、配列本体のコピーではなく、同じ場所を参照することになります

以下は、配列変数bに配列変数aを代入し、配列変数b[0]の値を変更した結果を表示するサンプルプログラムです

public class Sample {
    public static void main(String[] args){
        int[] a = {1, 2, 3};
        int[] b = {4, 5};
        b = a; // 配列変数bに配列変数aを代入
        b[0] = 10; //配列の本体b[0]に10を代入
        System.out.print("a:");
        for(int i=0;i<a.length;i++){
            System.out.print(a[i]+" ");
        }
        System.out.print("\nb:");
        for(int i=0;i<b.length;i++){
            System.out.print(b[i]+" ");
        }
    }
}
実行結果
a:10 2 3
b:10 2 3

配列変数bに配列変数aを代入するということは、配列変数bは配列変数aと同じアドレスを参照することになることを表しています
下図のようなイメージとなります

配列変数のコピー

配列変数のコピーは、コピー元の配列本体と同じ大きさの新しい配列を用意し一要素ずつコピーしていくことで、実現できます

以下は、配列変数aと同じ大きさの配列変数bを用意し、各要素の値をコピーするサンプルプログラムです

public class Sample {
    public static void main(String[] args){
        int[] a = {1, 2, 3};
        int[] b = new int[a.length]; //aと同じ大きさを確保する

        for(int i=0;i<a.length;i++){
            b[i]=a[i];
        }
        System.out.print("a:");
        for(int i=0;i<a.length;i++){
            System.out.print(a[i]+" ");
        }
        System.out.print("\nb:");
        for(int i=0;i<b.length;i++){
            System.out.print(b[i]+" ");
        }
    }
}
【実行結果】
a:1 2 3
b:1 2 3

下図のようなイメージとなります

【演習問題】

  1. 次のプログラムを作成してみましょう
    ① ⻑さ5のint型の配列を作成する
    ② ①の各要素に、1から10までの乱数を代⼊する
    ③ 配列の内容をすべて表⽰する
    ④ 配列の値の合計値と、平均値を表⽰する
    ⑤ 平均値よりも⼤きい数を表⽰する
    ⑥ 平均値よりも⼩さい数を表⽰する
実⾏結果
⽣成した整数:8/5/2/4/1/
合計=20 平均=4.0
平均よりも⼩さい値:2/1/
平均よりも⼤きい値:8/5/ 
  1. 次のプログラムを作成してみましょう
    ①5⼈分の国語と数学の点数を配列︓tensu[2][5]と定義する
    ②各点数は次のように定義する
    int [][] tensu={ {80, 60, 22, 50, 75},
            90, 55, 68, 72, 58} };
    ここで、tensu[0][n] は n 番⽬の⼈の国語の点数を、tensu[1][n] は n 番⽬の⼈の数学の点数を表すものとする
    (3) 国語、数学と合計点と平均点をそれぞれ表⽰する
実⾏結果
国語の合計点:287
国語の平均点:57.4
数学の合計点:343
数学の平均点:68.6
2教科の合計点:630
2教科の平均点:126.0

文字列

文字列を扱うにはStringクラスを使用します
※Stringクラスの詳細については、応用編で説明します
ここでは、文字列を変数に代入する方法、文字列の連結、キーボードから入力を受け付ける方法について説明します

文字列の定義

文字列の変数を定義するには、以下のように記述します

String 変数名;

変数名に文字列を代入するには、以下のように記述します

変数名="代入する文字列";

文字列はダブルクォーテーション(””)で囲みます

文字列の変数の定義と初期化を以下のように記述できます

String 変数名 = "代入する文字列";

文字列中にダブルクォーテーションや改行を含めたいときはエスケープシーケンスを使用します
エスケープシーケンスとは、タブや改行といった特種な文字で、下表のように¥記号とそれに続く1文字からなる表記で、この2文字で特殊な一文字を表します

表記 意味
¥” 文字としてのダブルクオーテーション(“)
¥’ 文字としてのシングルクオーテーション(’)
¥¥ 文字としての¥
¥n 改行

たとえば、以下のように記述します

```Java
String str = "こんにちは、¥"Taroさん¥"";
String str = "こんにちは¥nTaroさん"; // 改行する
```

文字列の連結

演算子のところでも説明しましたが、文字列同士を+演算子でつなげると文字列を連結することができます

以下は、文字列を連結するサンプルプログラムです

public class HelloWorld{
     public static void main(String []args){
        String msg1="Hello,";
        String msg2="nice to meet you.";
        String msg3=msg1 + msg2;
        System.out.println(msg3);
        System.out.println(msg1+msg2);
     }
}
実行結果
Hello,nice to meet you.
Hello,nice to meet you.

実行結果のように、msg3にはmsg1とmsg2を+演算子で結合したものが入っています

キーボードからの受付

キーボードからの入力を受け取る方法を説明します
まだ、説明していない機能を使っていますので、今は、このように記述するのだということだけ理解していただき、学習が進んでから再び、この内容を振り返ってみてください

import java.util.Scanner;
public class HelloWorld{

     public static void main(String []args){
        Scanner in = new Scanner(System.in);
        System.out.println("what is your name?");
        String name = in.next();
        System.out.println(name + ",Hello!");
        in.close();
     }
}
実行結果
what is your name? → プログラムからの出力
Taro → キーボードからの入力
Taro,Hello! → プログラムからの出力

import java.util.Scanner;

先頭で、キーボードから入力を受け付けるための機能を読み込みます

Scanner in = new Scanner(System.in);

キーボードから入力を受け付けるためのオブジェクトを生成します

String name = in.next();

コンソールに入力された文字列を受け取り、変数nameに代入します

in.close();

コンソールからの入力を終了します

【演習問題】

  1. キーボードから⽂字列を⼊⼒後、受け取った⽂字列とその⻑さを表⽰するプログラムを作成してみましょう
    文字列の長さは次のように取得します
   String変数.length();

コメント

この記事へのコメントはありません。

関連記事

Java 応用編 7日目

【Java】簡単操作でサーブレットをカスタマイズ!【動画あり】

Javaの学習方法

PAGE TOP