Java : 回答編(2)

[id:lethevert:20070414:p2]

void f (List l) {
  for (int i=0; i<l.size(); ++i) {
    g(l.get(i));
  }
}

以下ネタバレ注意

      • -

この問題を作ったときは、Java 1.4のつもりだったので、1.4の文法にしたがって回答します。
観点は2つです。1つは、for文のところ。
Listはランダムアクセスが効率的とは限らない(LinkedListのケースなど)ので、順次アクセスをする場合は必ずIteratorを使わなければいけません。

  for (Iterator i=l.iterator(); i.hasNext();) {
    g(i.next());
  }

もうひとつは、順次アクセスしかしないのなら、Listインターフェースを要求するまでもないことです。Collectionで十分です。

void f (Collection c) {
  for (Iterator i=c.iterator(); i.hasNext();) {
    g(i.next());
  }
}

Collectionインターフェースにしておかないと、後からMap#keySet()やMap#values()などを渡したくなったときに、直接渡すことができなくて面倒なことになります。
Java 5ならIterableインターフェースがあるので、次のようになります。

void f (Iterable<E> c) {
  for (E e: c) {
    g(e);
  }
}