こんにちは。今回の記事はJavaの繰り返し処理についてです。繰り返し処理の構文はいくつかありますが、今回はfor文と拡張for文を使いました。それぞれの特徴は以下です。
- for文では繰り返しの変数を使う。
- 拡張for文では繰り返しの変数は不要。
なお、拡張for文はJavaのバージョン5以降で使えます。
今回は配列をfor文や拡張for文で使ってみました。また、ArrayListをfor文や拡張for文で使ってみました。
配列またはListの要素として以下の自作クラスを使いました。
ソース
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
この記事の前半では、配列とListをfor文で使うときの書き方について、簡単なサンプルを載せています。後半では拡張for文の場合について、簡単なサンプルを載せています。
配列について復習
配列を使うと、複数の値をひとまとめに扱うことが出来ます。以下のプログラムは配列の最初の要素を出力する例です。
ソース
public class TestA001 {
public static void main(String[] args) {
// (1)
Person[] persons = {
new Person("name001", 21),
new Person("name002", 22),
new Person("name003", 23),
};
// (2)
Person person = persons[0];
System.out.println("name: " + person.getName());
System.out.println("age: " + person.getAge());
}
}
結果
name: name001
age: 21
(1)は配列の初期化です。配列の初期化の書き方はいくつかありますが、今回使ったのは、配列の値を書き並べる形式です。上記サンプルではnewを使って、Personのインスタンスを3つ書き並べています。以下のように配列にインスタンスが格納されます。
要素番号 | 内容 |
---|---|
0 | new Person(“name001”, 21)で生成されたインスタンス |
1 | new Person(“name002”, 22)で生成されたインスタンス |
2 | new Person(“name003”, 23)で生成されたインスタンス |
(2)では変数personに上記配列の最初の要素を格納しています。要素番号は0から始まるので、この書き方で最初の要素を指定していることになります。その後、クラスPersonのメソッドを呼び出して、フィールドの値を出力しています。
なお、上記の中括弧を使った配列の初期化は変数宣言と同じ行に記述する必要があります。以下のように配列の変数の宣言の後に中括弧の記述をするとコンパイルエラーが発生します。
コンパイルエラーになる記述
Person[] persons;
persons = {
new Person("name001", 21),
new Person("name002", 22),
new Person("name003", 23),
};
エラー内容
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
配列定数はイニシャライザーにおいてのみ使用可能です
上記の場合、配列の宣言と中括弧を使った個所を別の行にしているため、コンパイルエラーが発生します。
Eclipse上では上記の2行目以降個所に赤の波線が表示されます。
for文で配列を使う
for文で配列を使う場合、繰り返しのための変数で要素番号を指定することで配列の要素を順番に使うことが出来ます。以下のサンプルでは、要素番号順にインスタンスのフィールドの値を出力する例です。
ソース
public class TestA002 {
public static void main(String[] args) {
// (1)
Person[] persons = {
new Person("name001", 21),
new Person("name002", 22),
new Person("name003", 23),
};
// (2)
for (int i = 0; i < persons.length; i ++) {
Person person = persons[i]; // (3)
System.out.println("name: " + person.getName());
System.out.println("age: " + person.getAge());
}
}
}
結果
name: name001
age: 21
name: name002
age: 22
name: name003
age: 23
(1)は配列の初期化です。最初のサンプルと同じです。
(2)ではfor文を利用して、配列の各要素のフィールドの値を出力しています。ブロック内の処理の(3)の部分で、要素番号に繰り返しの変数iを指定しています。変数iの値は0,1,2の順に変化するため、配列の要素を順に取り出すことになります。println()メソッドの出力結果が配列の順番通りになります。
Listについて復習
Listはインターフェースのひとつです。Listの実装クラスとして代表的なクラスにArrayListがあります。ArrayListで複数のデータをひとまとめに扱うことが出来ます。以下のサンプルでは、Personクラスを要素に持つArrayListを使った例です。
ソース
import java.util.ArrayList;
import java.util.List;
public class TestB001 {
public static void main(String[] args) {
// (1)
List<Person> persons = new ArrayList<>();
persons.add(new Person("name011", 31));
persons.add(new Person("name012", 32));
persons.add(new Person("name013", 33));
// (2)
Person person = persons.get(0);
System.out.println("name: " + person.getName());
System.out.println("age: " + person.getAge());
}
}
結果
name: name011
age: 31
(1)では最初にArrlayListのインスタンスを生成しています。その後、add()メソッドで要素をArrlayListに追加しています。
(2)ではArrlayListに格納されたインスタンスを最初にに取得しています。get()メソッドに値0を指定することで、1番目のインスタンスが出来ます。上記の場合、ArrlayListのadd()メソッドで要素を追加しているだけなので、追加した順に要素番号が対応します。要素番号は配列の場合と同様0から始まります。
for文でListを使う
以下のサンプルはArrayListの要素を順番に取得して内容を出力する例です。
ソース
import java.util.ArrayList;
import java.util.List;
public class TestB002 {
public static void main(String[] args) {
// (1)
List<Person> persons = new ArrayList<>();
persons.add(new Person("name011", 31));
persons.add(new Person("name012", 32));
persons.add(new Person("name013", 33));
// (2)
int size = persons.size();
for (int i = 0; i < size; i++) {
Person person = persons.get(i); // (3)
System.out.println("name: " + person.getName());
System.out.println("age: " + person.getAge());
}
}
}
結果
name: name011
age: 31
name: name012
age: 32
name: name013
age: 33
(1)ではArrayListのインスタンスを生成しています。先ほどのサンプルと同じです。
(2)ではfor文を使って、ArrayListの要素のフィールドの値を順番に出力しています。size()メソッドはArrayListの要素の個数が取得できます。int型変数sizeにその値を格納し、for文の条件文に使用しています。条件式A < B
の場合、変数iの値は0, 1, 2と変化します。
(3)の個所でget()メソッドの引数に繰り返しの変数iを指定しています。配列の要素番号は0から始まるため、全ての要素を順番に取得することが出来ます。
以上のように、for文では配列やArrayListの要素を順番に取得することが可能であり、各要素を使った処理を記述することが出来ます。
拡張for文を使う
拡張for文は以下の書き方をします。
拡張for文の形式
for([A] : [B]) {
[C]
}
具体例は後に挙げます。[A], [B], [C]の個所では以下の内容を記述します。
- [A]の個所では、ループ内で使うための変数を宣言します。
- [B]の個所では、配列やArrayListを指定します。
- [C]の個所では繰り返したい処理を記述します。この個所では[A]で宣言した変数を使用することができます。
上記の書き方により、[B]で指定した配列・ArryaListの要素それぞれに対して、ブロック内の処理[C]が実行されます。ブロック内では[A]で宣言した変数が使用でき、[B]の各要素が順番に格納されます。
以下のサンプルでは、拡張for文で配列を使う処理とArrayListを使う処理をそれぞれ別々のメソッド内に記述してみました。
ソース
import java.util.ArrayList;
import java.util.List;
public class TestC001 {
public static void main(String[] args) {
TestC001 t = new TestC001();
System.out.println("----------------");
t.method1();
System.out.println("----------------");
t.method2();
}
public void method1() {
System.out.println("配列の場合");
Person[] persons = {
new Person("name001", 21),
new Person("name002", 22),
new Person("name003", 23),
};
// (1)
for (Person person : persons) {
System.out.println("name: " + person.getName());
System.out.println("age: " + person.getAge());
}
}
public void method2() {
System.out.println("ArrayListの場合");
List<Person> persons = new ArrayList<>();
persons.add(new Person("name011", 31));
persons.add(new Person("name012", 32));
persons.add(new Person("name013", 33));
// (2)
for (Person person : persons) {
System.out.println("name: " + person.getName());
System.out.println("age: " + person.getAge());
}
}
}
結果
----------------
配列の場合
name: name001
age: 21
name: name002
age: 22
name: name003
age: 23
----------------
ArrayListの場合
name: name011
age: 31
name: name012
age: 32
name: name013
age: 33
上記サンプルの(1)、(2)で拡張for文を使って同じ処理をしています。変数personsはそれぞれ配列・ArrayListです。
[A]の個所では[B]の要素の型を使うのが基本的な使い方です。今回は用意した配列・ArrayListの要素がPersonクラスなので、このクラス名を使って変数宣言を記述しています。今回の例では変数名をpersonにしました。
[C]の個所で上記変数を使うことが出来ます。出力結果を見ると、personには要素が順番に格納されているのがわかります。
上記サンプルのように拡張for文では要素番号を指定せずに順番に要素を取得することが可能で、各要素に対する処理を記述することが出来ます。
以上、参考になれば幸いです。