lesson7 配列

①配列とは

 変数は、1つの数値を入れておく「箱」に、データ型と名前をつけた「1つの入れ物」。 

 配列は、「1つの入れ物」が横に連なって並んでいる「箱の列」。箱の列には、データ型と名前をつける。また、配列の各箱には、0から始まる番号が順に振られて区別される。配列は参照型になる。

 

②宣言と初期化

int test;

 「配列の宣言」は、上記コードで行う。このコードでは、データ型intでtestという名前の配列を準備するという意味。要素の宣言。

 

test = new int[i];

 「配列の初期化」は、上記コードで行う。このコードでは、testという宣言済みの配列の中にi個の変数を準備する意味。要素の確保とも言う。※必ずnewをつける。

基本型の変数の場合は不要。

int test = new int [i];

 「配列の宣言と初期化」(要素の確保)は上記コードの様に1度に行う事ができる。この時データ型は統一する。

 

③代入

 配列の要素を確保できたら、配列の各変数に数値を代入する。

int test = new int[3];

test[0] = 50;

test[1] = 45;

test[2] = 65;

 

 上記のコード以外にも、下記のコードでも数値を代入できる。「test[0]」の0部分を添字または、インデックスと呼ぶ。

【注意】

 上記のコードでは、test[0]からtest[2]までのインデックスが貼られている。0から始まる為、要素の確保時に指定した引数「 new int[3] 」より、実際に作られる最後のインデックスは、-1になる。この時、配列の要素の確保が足らない時は、コンパイルは通るが、実行画面でエラーが起きる。

 

int test = {50,45,65,};

これは、一括して宣言から要素の確保し代入まで行う。

 

④配列と相性の良いfor文

識別子に引数を持つ配列変数は、for文と組み合わせる事により、宣言の記述や、キーボードから文字を入力するコードの記述を短縮する事ができる。

 基本型の変数(int num1やdouble dou2)は、数値を代入する際は、一つ一つを宣言し代入していかなければならない。識別子に引数を持たないのでfor文は使えない。よって毎回、

num1=

num2=

.......

と記述しなければならなかった。

 対して、配列では識別子に引数がある。よってfor文を用いてコードを短略できる。

import java.io.*;

class Sample1

{

      public static void main(String args)throws IOException

   {

       System.out.println("配列を作します。作成する配列の数を入力して下さい。");

       BufferedReader br =

          newBufferedReader(new InputStreamReader(System.in,"SJ I S"));

 

        String str1 = br.readLine();

         int num1 =  Integer.parseInt(str1);

         int  test = new int[num1];

          //int型の配列をnum1個の宣言

 

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

           String str = br.readLine();

           test[i] =  Integer.parseInt(str);

           System.out.println("test"+ i +"は"+test[i]+"です。");

     }

  }

}

 

⑤参照型

 配列は参照型である。参照型とは、実際の数値を格納しているのではなく、場所の位置のみを参照している型の事。例えば下記のコードは、int型配列の0番初めに5を代入したという記述になる。

int[0]=5

int[0]は実際に5を格納しているのではなく、5を格納している場所(アドレス)を格納している。

参照型の特徴の1つとして、配列同士を代入した際は数値がもう一つ作られるのではなく、代入した配列を参照(指している)という事になる。よって、代入した配列の参照先が変われば、代入された方も変わる事となる。

class Sample1

{

   public static void main(String args)

   {

     int num1 = new int[2];

     int num2 = new int[2];

     num1[0] = 5;

     num1[1] = 10;

 

     num2 = num1;//※1

 

     num1[0] = 15;

     System.out.println("num1[0]は"+num1[0]+"です。");

     System.out.println("num2[0]は"+num2[0]+"です。");

      }

}

上記コードの場合、両方とも15が出力される。配列は、実際の格納ではなく参照なので、※1の代入演算子によりnum2はnum1に関連付けられた事になり、num2は num1を指し示す。よって指し示しているnum1に変更があれば、num1を指し示しているnum2も変更されるという仕組みになっている。当然、 num2ではなく直接数値等を代入した際は、代入した数値を指し示しているので、num2に影響されない。

 

⑥多次元配列

 これまでの配列は1列であった。この1列の配列要素の中に、さらに配列要素を組み込む事ができる。int[0]の中にさらに配列を入れる。2次元配列であれば、エクセルの様なワークシートをイメージする。

2次元配列の宣言(要素の確保)

int test;//要素の宣言

new int[3][4];//要素の確保

上記コードは、3個の各配列要素の中に4個の配列要素を組み込んだ配列を準備したという事になる。エクセルで言うと横3セル縦4セルの合計12セルを準備した事となる。また、下記の様に1行でも示せる。

int test = new int[3][4];//要素の宣言と確保

 

2次元配列の代入

1次配列と同じ様に下記の様に代入できる。1次配列と同様に最初はインデックス(添字)は0から始まる。

int[0][0] =1;

int[0][1] =2;

int[0][2] =3;

int[0][3] =4;

int[1][0] =5;

・・・

・・・

int[2][2] =11;

int[2][3] =12;

1つ1つ代入していく事もできるが、要素の確保と代入をカッコでくくり、一括して行う事もできる。

int test1 ={{1,2,3,4},{5,6,7,8},{9,10,11,12}};

カッコがたくさんありややこしい様に見えるが、1列の配列要素の中に、さらに配列要素を組み込んでいて枝分かれしていると認識すれば理解しやすい。

上記コードは、要素int[3][4]になる。

int[0][0]が1  int[1][0]が5  int[2][0]が9

        [1]が2           [1]が6          [1]が10

        [2]が3           [2]が7          [2]が11

        [3]が4           [3]が8          [3]が12

になる。

int[] test1 ={ {int[0]} , {int[1]} , {int[2]} };

各、int[0]~int[2]までの配列の中にさらに配列をネストしていると考える。

この様に考えると、2次元以上の配列もint[0][0]の中に更に配列が組み込まれている事を理解する。型を暗記しコードを書ける様にするのではなく、しくみを理解してアウトプットを継続的に行う事により初めて使える様になる。

 

多次元は配列での.length

多次元配列でも配列要素を調べる為に.lengthを使用する事ができる。1次配列の配列の要素を調べる場合は、『添字識別子.length』であった。

多次元配列の場合は、『添字識別子[添字].length』で配列要素を調べられる。上記の配列test1の場合、『test[0].length;』は、

test[0][0]

test[0][1]

test[0][2]

test[0][3]

の要素を調べるので、4になる。

この時、『test.length;』とした場合は

test[0]

test[1]

test[2]

の要素が調べれるので、3となる。