配列とは、同一種類の複数データを並び順で格納するデータ構造。
データ構造とは、データの集まりをコンピュータの中で、効果的に扱うため、一定の形式に系統立てて格納するときの形式。
左の図のように
配列は、いくつかあるデータ構造の中の一つである。
業務では、あまり使われない。
同一種類の複数データを並び順で格納する、とは、どういうものなのかみていきたい。
配列のイメージ図は以下のとおり。
要素(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 件のコメント:
コメントを投稿