Javaでは、配列を使うと、同じ型の複数の値を1つの構造にまとめて保存できます。他のデータ構造と違い、配列は一度作成するとサイズを変更できません。配列の要素には、インデックスを使って値を代入したり、取り出したりできます。Javaの配列は0から始まるインデックスを使います。最初の要素のインデックスは0、2番目の要素のインデックスは1、といった具合です。
配列を初期化する標準的な構文は次のとおりです。
type[] variableName = new type[size];
typeは配列の要素の型で、プリミティブ型(intなど)またはクラス(Stringなど)を指定できます。
sizeはこの配列が保持する要素の数です(後から変更することはできません)。配列を作成すると、要素はそれぞれのデフォルト値(通常は0、false、null)で初期化されます。
// Declare array with explicit size (size is 2)
int[] twoInts = new int[2];
配列は、作成と値の設定を同時に行える省略記法でも定義できます。
// Two equivalent ways to declare and initialize an array (size is 3)
int[] threeIntsV1 = new int[] { 4, 9, 7 };
int[] threeIntsV2 = { 4, 9, 7 };
コンパイラーが配列の要素数を判断できるため、長さは省略できます。
配列の要素は、角括弧を使ったインデックス表記で代入したりアクセスしたりできます。
// Assign second element by index
twoInts[1] = 8;
// Retrieve the second element by index and assign to the int element
int secondElement = twoInts[1];
配列の有効なインデックスの範囲外にアクセスすると、IndexOutOfBoundsExceptionが発生します。
配列は、配列インスタンスのメソッドやプロパティを呼び出すか、Arraysクラスで定義された静的メソッド(通常はジェネリックなコードでのみ使用します)を使って操作できます。lengthプロパティには配列の長さが入っています。次のようにアクセスできます。
int arrayLength = someArray.length;
Javaには、配列に関する便利なメソッドを数多く備えたユーティリティクラスjava.util.Arraysも用意されています(例:Arrays.equals)。
Javaは、int[][] arr = new int[3][4];のような多次元配列もサポートしており、とても便利です。
配列が_コレクション_でもあるということは、インデックスで値にアクセスする以外に、for-eachループを使って_すべての_値を繰り返し処理できるということです。
char[] vowels = { 'a', 'e', 'i', 'o', 'u' };
for(char vowel: vowels) {
// Output the vowel
System.out.print(vowel);
}
// => aeiou
繰り返し処理する値をより細かく制御したい場合は、forループを使えます。
char[] vowels = { 'a', 'e', 'i', 'o', 'u' };
for (int i = 0; i < 3; i++) {
// Output the vowel
System.out.print(vowels[i]);
}
// => aei
あなたは熱心なバードウォッチャーで、この7日間に庭に何羽の鳥が来たかを記録しています。
庭に来た鳥の数を扱うタスクが6つあります。
比較のため、先週の数もいつも手元に控えてあります。先週の数は、0、2、5、3、7、8、4でした。先週の数を返すBirdWatcher.getLastWeek()メソッドを実装しましょう。
BirdWatcher.getLastWeek();
// => [0, 2, 5, 3, 7, 8, 4]
今日、庭に何羽の鳥が来たかを返すBirdWatcher.getToday()メソッドを実装しましょう。鳥の数は日の順に並んでいて、最初の要素が一番古い日の数、最後の要素が今日の数です。
int[] birdsPerDay = { 2, 5, 0, 7, 4, 1 };
BirdWatcher birdCount = new BirdWatcher(birdsPerDay);
birdCount.getToday();
// => 1
今日の数を増やすBirdWatcher.incrementTodaysCount()メソッドを実装しましょう。
int[] birdsPerDay = { 2, 5, 0, 7, 4, 1 };
BirdWatcher birdCount = new BirdWatcher(birdsPerDay);
birdCount.incrementTodaysCount();
birdCount.getToday();
// => 2
庭に来た鳥が0羽だった日があればtrueを返し、そうでなければfalseを返すBirdWatcher.hasDayWithoutBirds()メソッドを実装しましょう。
int[] birdsPerDay = { 2, 5, 0, 7, 4, 1 };
BirdWatcher birdCount = new BirdWatcher(birdsPerDay);
birdCount.hasDayWithoutBirds();
// => true
週の初めから庭に来た鳥の数を返すBirdWatcher.getCountForFirstDays()メソッドを実装しましょう。ただし、数えるのは週の初めからの指定された日数分だけにします。
int[] birdsPerDay = { 2, 5, 0, 7, 4, 1 };
BirdWatcher birdCount = new BirdWatcher(birdsPerDay);
birdCount.getCountForFirstDays(4);
// => 14
日によっては、他の日より忙しいこともあります。忙しい日とは、庭に5羽以上の鳥が来た日のことです。
忙しい日の数を返すBirdWatcher.getBusyDays()メソッドを実装しましょう。
int[] birdsPerDay = { 2, 5, 0, 7, 4, 1 };
BirdWatcher birdCount = new BirdWatcher(birdsPerDay);
birdCount.getBusyDays();
// => 2