私が持っているとしましょうCollection
。そして、インデックス 2 の要素を取得する必要があります。
get メソッドがなく、反復子がインデックスを追跡しない場合、どうすればよいでしょうか?
何よりもまず、実際の実装を活用してみてください。List
ダウンキャストしてより良い API を使用できる場合:
if(collection instanceof List) {
((List<Foo>)collection).get(1);
}
しかし、「純粋な」解決策は、 を作成して2 回Iterator
呼び出すことです。next()
それはあなたが持っている唯一の一般的なインターフェースです:
Iterator<Foo> fooIter = collection.iterator();
fooIter.next();
Foo second = fooIter.next();
これは、k 番目の要素に簡単に一般化できます。しかし、気にしないでください。そのための方法がすでにあります。Iterators.html#get(Iterator, int)
グアバでは:
Iterators.get(collection.iterator(), 1);
...または次の場合Iterables.html#get(Iterable, int)
:
Iterables.get(collection, 1);
これを何度も行う必要がある場合は、 でコレクションのコピーを作成する方が安価な場合がありますArrayList
。
ArrayList<Foo> copy = new ArrayList<Foo>(collection);
copy.get(1); //second