2014年9月25日木曜日

- 配列 - Java

今日は、 配列 について学習する。

配列とは、同一種類の複数データを並び順で格納するデータ構造

データ構造とは、データの集まりをコンピュータの中で、効果的に扱うため、一定の形式に系統立てて格納するときの形式。





左の図のように
配列は、いくつかあるデータ構造の中の一つである。
業務では、あまり使われない。












同一種類の複数データを並び順で格納する、とは、どういうものなのかみていきたい。
配列のイメージ図は以下のとおり。






















要素(element)と呼ばれる箱が、連続して並んでいるのが配列。
この要素とは、格納されているデータ一つ一つのこと。

これだけでは、よくわからないので、実際に書いてみる。


















変数と同じように、最初に宣言をする。
次も変数のときと同じように、代入する。

~注意点~
・配列の各要素には、同一種のデータしか格納できない
・添え字は必ず 0 から始まる。

また、「配列変数の宣言」と「要素の作成と代入」は同時におこなうことができる。

double [ ] weight;
weight = new double[5];



double [ ] weight = new double [5] ;

という一行にできる。



package blog;

public class Array {

 public static void main(String[] args) {

  // double型の要素に weight という配列変数名をつける
  double[] weight;

  // weight に 5つの要素を作る
  weight = new double[5];

  // 作成した5つの要素に、値を代入する
  weight[0] = 47.2;
  weight[1] = 46.2;
  weight[2] = 46.8;
  weight[3] = 46.9;
  weight[4] = 46.7;

  // weight[4](5番目) を参照する
  System.out.println("今日の体重は" + weight[4] + "kgだった");
 }

}









また、これと同じ内容のコードを、データ構造を使わずに書いた場合。


package blog;

public class Weight {

 public static void main(String[] args) {

  // 変数宣言と代入
  double weight1 = 47.2;
  double weight2 = 46.2;
  double weight3 = 46.8;
  double weight4 = 46.9;
  double weight5 = 46.7;

  // 変数 weight5 を参照する
  System.out.println("今日の体重は" + weight5 + "kgだった");
 }

}










データ構造を使うと、とてもすっきりしたコードになる。


配列には、省略記法が二種類あり、初期値の代入を、簡単に書くことができる。



















実際に使ってみる。


package blog;

public class Abbreviation {

 public static void main(String[] args) {

  // 「配列変数の宣言」と「要素の作成と代入」を同時に行う
  int[] sleepTime = new int[4];
  sleepTime[0] = 420;
  sleepTime[1] = 460;
  sleepTime[2] = 480;
  sleepTime[3] = 380;

  System.out.println("今日の睡眠時間は" + sleepTime[3] + "分でした");

  // 省略した書き方(配列の作成と初期値の代入を同時に行う)

  int[] studyTime = new int[] { 300, 320, 250, 200 };
  System.out.println("今日の勉強時間は" + studyTime[3] + "分でした");

  // 省略した書き方(配列の作成と初期値の代入を同時に行う)
  int[] sports = { 60, 120, 90, 30 };
  System.out.println("今日の運動時間は" + sports[3] + "分でした");

 }
}










配列の要素数の取得

また、配列は要素数を取得(要素の長さを出す)出来る。

書き方は、簡単で






配列変数名のあとに length(長さという意味)をつけるだけ。


package blog;

public class Acquire {

 public static void main(String[] args) {

  // 配列変数の宣言と、要素の作成と代入をおこなう
  int[] consumptionTime = { 350, 300, 200, 350, 500 };

  // consumptionTime.length で、要素の数を取得する
  System.out.println(consumptionTime.length + "日間、勉強しました");
 }

}









要素数の取得の応用

for文 の終了条件に、 配列変数名 .length と書くと、
配列の各要素を順番に取り出せる。
この、各要素のはじめから最後まで、順番に取り出すことを、配列を回す、という。

package blog;

public class TurnArray {

 // 2014年の祝日を、forループ をつかって、出力するプログラム
 public static void main(String[] args) {

  // 配列変数 nationalHoliday に 要素を作成し、値を代入
  int[] nationalHoliday = { 2, 1, 1, 1, 4, 0, 1, 0, 2, 1, 3, 1 };

  System.out.println("これが、2014年の祝日!!!!");
  System.out.println("振り替え休日も込み。");

  // 終了条件に nationalHoliday を用いて、配列をまわす。
  for (int i = 0; i < nationalHoliday.length; i++) {
   // 添え字に 変数i を用いて、要素を取得
   System.out.println((i + 1) + "月の祝日は" + nationalHoliday[i] + "日間です");
  }

 }
}

















拡張for文

さらに応用。
拡張for文とは、
配列の要素を一つずつ取り出すループを簡単に書くために導入された新しいfor文。
データ構造(主に List)で多用されるため、よく理解しておいたほうがいい。

~注意~
バージョンが Java5以降 でしか利用できない!!

















package blog;

public class Expansion {

 // 2014年の祝日を、拡張for文 をつかって、出力するプログラム
 public static void main(String[] args) {

  // 配列変数 nationalHoliday に 要素を作成し、値を代入
  int[] nationalHoliday = { 2, 1, 1, 1, 4, 0, 1, 0, 2, 1, 3, 1 };

  System.out.println("これが、2014年の祝日!!!!第二段!!!");
  System.out.println("また振り替え休日も含みます。");

  // 変数 month は、何月かを表す変数
  // 月は、1月から始まるので、month には 1 を代入
  int month = 1;
  // 拡張for文
  for (int holiday : nationalHoliday) {

   // 任意の変数 holiday のみで、値が代入された要素を呼び出せる
   System.out.println((month++) + "月の祝日は" + holiday + "日です");
  }
 }

}


















int month = 1;
(month++)
のあたりが、美しくないですね。
拡張for文を使うと、以前の普通のfor文で配列を回しているときと比べて、非常にスタイリッシュになる。
新しい構文は、スタイリッシュなようです。
非常に大切だから、拡張for文を使って、いろいろ書いてみるといいかもしれない。


多次元の配列

今まで学んだのは、1次元配列。
次は、縦の並びを加えた、2次元配列について学習する。

イメージは以下。




























2次元配列の宣言
要素の型 [ ] [ ]     配列変数名 = new 要素の型[ 行数 ][ 列数 ]

2次元配列の要素の利用
配列変数名 [ 行の添え字 ][ 列の添え字 ]

これまでと同じように、一行にまとめて書くことができる

要素の型 [ ] [ ] 配列変数名 = { { 初期値1,初期値2,初期値3...} , { 初期値1,初期値2,初期値3... } } ;


package blog;

public class TwoDimensions {

 // 数学と英語の合計勉強時間を出すプログラム
 public static void main(String[] args) {

  // 2次元配列の宣言と代入
  int[][] time = { { 30, 70, 50 }, { 60, 40, 70, 30, 40 } };

  // int型の変数 totalEnglish の宣言
  int totalEnglish = 0;

  // int型の変数 totalMath の宣言
  int totalMath = 0;

  // 拡張for文を使って、一行目の要素を順番に取得
  for (int english : time[0]) {

   // totalEnglish に english を足していく
   totalEnglish += english;

  }
  // time[0](2次元配列の一行目)の要素数を取得
  System.out.print(time[0].length + "日間の英語の合計勉強時間は");
  System.out.println(totalEnglish + "時間");

  // 拡張for文を使って、二行目の要素を順番に取得
  for (int math : time[1]) {

   // totalMath に math を足していく
   totalMath += math;
  }
  // time[1](2次元配列の二行目)の要素数を取得
  System.out.print(time[1].length + "日間の数学の合計勉強時間は");
  System.out.println(totalMath + "時間");
 }
}











コードがぐちゃぐちゃになってきました。
もう少し、綺麗に書けそうですね。

次は「メソッド」について学習するので、少しは改善されるかもしれません!






0 件のコメント:

コメントを投稿