配列
配列の要素の参照や要素への値の代入などでの要素の指定方法はCと同じです。
a[0] = 1; a[1] = a[0] + 2;
配列の大きさ
配列の大きさは length で得ることができる。
配列の宣言と使い始めに必要な処理は異なります。
例
1行目の変数宣言 int[ ] a; により、変数aの場所が用意される。
a の型は int[ ] (すなわち int型の配列)であるが、変数aのために用意されるのは参照型の値が入る箱1つだけである。
2行目の new int[100] により、int型のデータが100個並んだオブジェクトが作られる。
それを a に代入することで、aを使って配列の各要素を参照できるようになる。
3~4行目では配列の要素に0を代入している。
aが参照している配列の大きさは a.length で得ることができ、繰り返しの中で利用している。
変数aの定義と配列オブジェクトの作成が別々になっていることに注意。
配列オブジェクトは実行時に作成されるので、配列の実際の大きさも(コンパイル時でなく)実行時に決まることになる。
3~4行目で用いられている変数iの宣言も必要だが(説明と関係ないので)省略した。
演習
次のCで書かれたプログラムはエラトステネスの篩を用いて1000までの素数を表示するものです。
これをもとにして、Javaのプログラムを作成しなさい。
- ファイル名はLesson3.javaとすること。
- 慣習に従って、美しいプログラムにすること。
- Nは定数として記述しなさい。
- Nを別の値にしたいときは、定数記述の1箇所だけの修正ですむようにすること。
- wをboolean型配列として宣言し、サイズNで割り当てなさい。
- wの配列要素に値を代入しているところが2箇所あります。
- 正しいbooleanの値を代入するように修正しなさい。
- その他、必要な修正を行って正しく動作するようにしなさい。
(1)
上のCプログラムと同じ動作をするプログラムを作成しなさい。
(2)
求まった素数の個数と、求まった素数のうち最大のもの1つだけを表示するように修正しなさい。
(3)
あなたが使っているJava処理系で、どのくらい大きなNまで処理できるか調べなさい。
上級では次の点を調べる必要があります。
- コンパイルできること。
- 配列をnewで確保できること。
- ある程度の時間内に実行できること。
- 正しく処理されること。
java コマンドにヒープサイズオプションをつけて実行すると 大きな配列を確保することができます。
> java -Xmx500m Lesson3
- 大文字Xと小文字xに注意
- 500m の部分に使用するヒープメモリサイズを書く
演習用サーバを使っている人はlinuxのコマンドを使って実行時間を計測することができるので、 いくつかのNについて調べてみると良いでしょう。
> time java Lesson3
1~3を解決してもこのプログラムでは、Nがある値を超えるとうまく処理されなくなります。 理由を考えてください。