コレクション要素の走査
このままじゃ、また技術系なネタが無いままなんで、適当にでっちあげて書いてみます(w
リストの各要素に対して処理を行なう場合、下記のようにインデックスを使用して各要素へのアクセスを行なっているコードをよく見かけます。*1
List itemList = new ArrayList(); : (要素の追加等) : for(int i=0; i<itemList.size(); i++) { Item item = (Item)itemList.get(i); item.foo(); }
でも、この処理ってインデックス値の値がいくつであるかっていうのは、処理の本質にはなにも関係しなかったりする。
なので、私の場合はインデックス値が処理の本質に関係ない場合は、ほとんどの場合インデックスアクセスではなくイテレータを使用してます。
イテレータを使用すると下記のようになります。
List itemList = new ArrayList(); : (要素の追加等) : for(Iterator itr=itemList.iterator(); itr.hasNext();) { Item item = (Item)itr.next(); item.foo(); }
この辺は好みもあるのかもしれないけど、私は処理の本質に関係ないものは極力排除したかったりするんで。インデックスアクセスを利用するのはインデックス値が意味を持つ場合だけかな。
あと、イテレータなら List にかぎらず、Collectionを実装しているものに対して使用できるし。Setとかね。
1.5からはもっとスマートに書けるようになるんだけどね。
蛇足だけど、1.4のころからListのオブジェクトに対してインデックスアクセスをした方が効率がよいかもしれないものについては、RandomAccessというマーカインタフェースが実装されてたりします。もっとも、これを見て処理を変え、数ミリ秒とかを稼がなきゃいけないほどシビアなものを書く機会はそうそうないかと。そのまえに、根本の構造をかえて高速化してしまいます(w
*1:sizeメソッドが毎回呼び出されるのを嫌って、ループの事前に int size=itemList.size(); としているのもよく見かけますね。