繰り返し(Java)
繰り返し
はじめに
ここまでで、Javaプログラミングの基本についてイメージできてきたのではないかと思います。ここでは、プログラムの基本制御のひとつである。繰り返し処理について、例を作りながら説明します。for文(配列を使った処理)
これまでの例題を作ってきたなかで、「このサンプルは、ループを使えば簡単にかけるな」と思われたがいらっしゃったと思います。まずは、配列をつかったfor文を書いてみましょう。test.basicパッケージに、配列の練習のときに作ったSample008をSample013という名前でコピーしてください。これを修正して実験してみましょう。package test.basic;
public class Sample013 {
public static void main(String[] args) {
// int型の3の要素をもつ配列の宣言
int[] i1 = new int[3];
// 配列に代入
i1[0] = 1;
i1[1] = 2;
i1[2] = 3;
StringBuffer sb = new StringBuffer();
sb.append("【int】;");
// 配列要素の出力をループで行う。
for(int j=0; j<i1.length ; j++){
sb.append(Integer.toString(i1[j]));
if(j < (i1.length-1)) sb.append(";");
}
System.out.println(sb.toString());
// int型の3の要素をもつ配列の宣言
int[] i2 = {100,200,300};
sb.delete(0,sb.length());
sb.append("【int】;");
// 配列要素の出力をループで行う。途中でブレークする。
for(int j=0; j<i2.length;j++){
sb.append(Integer.toString(i2[j]));
if(j == (i2.length-1)) break;
sb.append(";");
}
System.out.println(sb.toString());
}
}
これを実行してみてください。以下のような結果がでましたか?
【int】;1;2;3
【int】;100;200;300
for文の基本形は以下です(注;Java5.0では、この記述を簡単にする「拡張for文」が導入されました)。
for(初期化式 ; 終了条件 ; 増分){
繰り返し処理する命令群
}
ポイントがあるとすれば、配列の先頭のインデックスが0であることと、終了条件として必要な配列の長さは「配列名.length」で取得できることです。ループが途中で嫌になったらbreak文でループを抜けることができます。
この例では、文字列の作成にStringBufferを使っています。ループを使うとappend()メソッドで文字列を追加していく方が、(+でStringを足していくよりも)簡単ですね。それに以前にお話しましたように、Stringを+でつなぐよりも、StringBufferを使った方が高速です。
for文とwhile文(ArrayListを使った処理)
次は、ArrayListをつかったfor文を書いてみましょう。また、繰り返しの制御にはfor文のほかにwhile文もあり、Collectionを扱う際にはこちらを使った方が簡単にです。test.basicパッケージに、ArryListの練習のときに作ったSample011をSample014という名前でコピーしてください。package test.basic;
import java.util.ArrayList;
import java.util.Iterator;
import test.basic.bean.Actor;
public class Sample014 {
public static void main(String[] args) {
ArrayList aList1 = new ArrayList();
ArrayList aList2 = new ArrayList();
ArrayList aList3 = new ArrayList();
// ArrayListに要素を追加する。
// 基本型はラッパークラスに入れる。
aList1.add(new Integer(1));
aList1.add(new Integer(2));
aList1.add(new Integer(3));
// クラス型はそのまま入る。
aList2.add(new Actor("宙返りをする"));
aList2.add(new Actor("トンボがえりをする"));
aList2.add(new Actor("月面宙返りをする"));
StringBuffer sb = new StringBuffer();
sb.append("【int】;");
// 【1】ArrayList要素の出力をforループで行う。
for(int j=0; j<aList1.size() ; j++){
sb.append(((Integer)aList1.get(j)).toString());
if(j < (aList1.size()-1)) sb.append(";");
}
System.out.println(sb.toString());
sb.delete(0,sb.length());
sb.append("【int】;");
// 【2】 ArrayList要素の出力をIteratorを使い、whileループで行う。
int j = 0;
Iterator it = aList1.iterator();
while(it.hasNext()){
sb.append(((Integer)it.next()).toString());
if(j < (aList1.size()-1)) sb.append(";");
j++;
}
System.out.println(sb.toString());
sb.delete(0,sb.length());
sb.append("【Actor】;");
// 【3】 ArrayList要素の出力をIteratorを使い、whileループで行う。
j = 0;
it = aList2.iterator();
while(it.hasNext()){
sb.append(((Actor)it.next()).action());
if(j == (aList2.size()-1)) break;
sb.append(";");
j++;
}
System.out.println(sb.toString());
}
}
これを実行してみてください。以下のような結果がでましたか?
【int】;1;2;3
【int】;1;2;3
【Actor】;宙返りをする;トンボがえりをする;月面宙返りをする
この例では【1】〜【3】の3つのループがありますが、【3】はbreak文が使えることを示しているだけです(ここでは本質的でないコード)。【1】では配列と同様にArrayListから要素を取得しています。【2】に注目してください。まず、while文の基本形は以下です。
while(真偽式){
繰り返し処理する命令群
}
「真偽式」とは戻り値としてboolean(true|false)を返す式のことです。【2】のポイントはArrayListから.iterator()メソッドで、java.util.Iterator型のイタレータを取り出し、それを活用して処理を行っていることです。
ArrayList、LinkedList、VectorといったListからはこのiteratorを取得することが可能です。Listから要素をLoopで取り出す際にはこのイタレータを使用するのが定石です。また、java.util.Iteratorには、この例題でつかったhasNext()、next()とremove()というメソッドしかありませんが、 java.util.ListIteratorというイタレータも取得することができます。このListIteratorには、これらメソッドに加えて、hasPrevious()、previous()、nextIndex()、previousIndex()といったメソッドが用意されています(これを使えば、次だけではなく、戻ることができますね)。
2007年02月26日(月) 15:25:55 Modified by wanderingse