ページ

2014年4月1日

拡張forループでループの回数も同時に欲しいよね。

ちょっとだけ、拡張forで質問があったので、追加です。
前回の記事の中で次のように書いています。



> 拡張forループはいいのですが、今がコレクションの何番目か、ってのが取れたらもっと良かったのに…。

これは言語仕様としてはインデックスの位置が取れないと言うだけです。ちょっと別の言語で、goの場合は次のように書けてインデックスも同時に取得できます。便利ですね。

array := []string {"hoge", "fuga"}
for index, value := range array {
   // do something...
}

Javaのforループでは2つの値をとることができませんが、自前でイテレータを書くことができます


拡張forループで使えるようにするには、Iterableをimplementすればいいだけです。
で、こんな感じで使えるようになれば、まあ目的は達成できますね。

public class IndexableIterator<T> implements Iterable<T> {
   public static class Entry<T> {
        final int index;
        final T value;
        private Entry(int index, T value) {
            this.index = index;
            this.value = value;
        }
        public int getIndex() { return index; }
        public T getValue() { return value; }
    }


   // TODO: implement
}

というような感じで、IndexableIteratorを作って、実際に使う場面では

List<String> l = new ArrayList<String();
l.add("hoge");
l.add("fuga");
for (IndexableIterator.Entry<String> entry: new IndexableIterator<String>(l)) {
    int index = entry.getIndex();
    String v = entry.getValue();
    // do something...
}

みたいな感じですね。あとは、IndexableIteratorのTODOってところを実装すればいいだけです。



で、Java8のStream使って書こうかと思ったら、標準ライブラリからいつの間にかzipメソッドがなくなっているのね・・・。なので、Java8のstreamは池添さんが書いてくれるはず。

0 件のコメント: