1

現在、 をループするには 2 つのアプローチがあることを知っていますList。しかし、もう少し複雑にしましょう。次のことを考慮してください。

  • を繰り返しList<E> listます。
  • int y反復ごとに追跡したいとします。
  • process(E elem, int y)アイテムを処理する機能があります。

オプション1:

for (int i = 0, y = 0; i < list.size(); i++, y++) {
    process(list.get(i), y);
}

実際には

for (int i = 0; i < list.size(); i++) {
    process(list.get(i), i);
}

オプション 2:

int y = 0;
for (E elem : list) {
    process(elem, y);
    y++;
}

に書き換えることができます

int y = 0;
for (E elem : list) {
    process(elem, y++);
}

しかし、なぜ次のものが存在しないのですか?それが存在しないことに対する異議は何ですか?

オプション 3:

for (int y = 0; E elem : list; y++) {
    process(elem, y);
}

このコンストラクトを持つ 2 つの引数:

  • どちらのforeach構文も区別可能
  • 多くのオブジェクトは を実装Iterable<E>していますが、対応するものはありませんfor。これはIterable<E>、たとえば、 に注文が関連付けられていない場合に発生します。
4

6 に答える 6

0

これは意見に基づく質問だと思います。言語設計者だけがそれに答えることができました。

インデックスを使用可能にするためにIteratorラップする新しいオブジェクトの作成を受け入れる場合は、ユーティリティ クラスを使用して構文を多少改善できます。Iterator以下の例を参照してください。

public static void main(String[] args) {
    List<String> list = Arrays.asList( new String[] {"item1", "item2", "item3"} );

    for (IndexIterator<String> it = IndexIterator.of(list.iterator()); it.hasNext();) {
        System.out.println( it.next() + " : " + it.index() );
    }
    // Prints:
    // item1 : 0
    // item2 : 1
    // item3 : 2
}

ユーティリティ クラスは次のIndexIteratorとおりです。

public static class IndexIterator<T> implements Iterator<T> {
    private int index = -1;
    private Iterator<T> iterator;
    public IndexIterator(Iterator<T> it) {
        this.iterator = it;
    }

    @Override
    public boolean hasNext() {
        return iterator.hasNext();
    }

    @Override
    public T next() {
        index++;
        return iterator.next();
    }

    @Override
    public void remove() {
        iterator.remove();
    }

    public int index() {
        return this.index;
    }

    public static <T> IndexIterator<T> of(Iterator<T> it) {
        return new IndexIterator<T>(it);
    }
}
于 2013-07-23T14:44:06.267 に答える