終わらないイテレータを作成するにはどうすればよいですか?
質問
セットを無期限に反復する最も簡単な方法、つまり、最後に到達すると next();
が最初のオブジェクトを呼び出すのは何なのかと思っていました。これはJavaで既に事前定義された関数ではないと想定しているため、Javaでこれを実装する最も簡単な方法を探しています。
解決
優れた Googleコレクションライブラリには、これを行うメソッドがあります:
Set<String> names = ...;
Iterable<String> infinite = Iterables.cycle(names);
(Googleコレクションライブラリを強くお勧めすることはできません。非常に難しいです。Googleで働いていると偏見がありますが、Javaを書いているほとんどのGoogle社員がコレクションの有用性を教えてくれると思います。)
他のヒント
Iterator it = mylist.iterator();
while (it.hasNext())
{
MyType t = (MyType)it.next();
// do something
if (!it.hasNext())
it = mylist.iterator();
}
EndlessIterator Cactoos からのコード>
:
Iterator<String> names = new EndlessIterator<>("John");
常に&quot; John&quot;
が返され、終了することはありません。
また、 EndlessIterable
。これは Iterable
を実装し、同じことを行います。
イテレータを作成している場合、次のメソッドでは、リストに別のオブジェクトがあるかどうかをチェックするif条件を設定できます。存在する場合はそのオブジェクトを返し、存在しない場合はリストの先頭に戻ってそのオブジェクトを返します。
これは私が考えることができるものです...
iterator = set.getIterator
//other code
if (iterator.hasNext())
//do code here
else
iterator = set.getIterator();
イテレータで簡単にできることは何でもできますが、追加する新しいものには注意する必要がありますが、このスタイルでは使用しないでください。
if(!It.hasNext()) { while(It.hasPrevious()) { It = It.Previous(); } } else { It = It.Next(); }
新しいリストをプッシュするときは、常に最後のネクストポインタを最初のネクストポインタにする必要がある場合、この方法は意味がありません。
どうですか?
List<String> list = // ArraysList
Interator<String> it = null;
while(true) {
it = list.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
}
Guavaを使用したくないが、再利用可能なソリューションが必要な場合:
public static class CyclicIterator<E, C extends Collection<E>> implements Iterator<E> {
final private C mElements;
private Iterator<E> mIterator;
public CyclicIterator(C elements) {
mElements = elements;
mIterator = elements.iterator();
}
@Override
public boolean hasNext() {
if (! mIterator.hasNext()) {
mIterator = mElements.iterator();
}
return mIterator.hasNext();
}
@Override
public E next() {
if (! mIterator.hasNext()) {
mIterator = mElements.iterator();
}
return mIterator.next();
}
}
注:これはremove()メソッドをサポートしていませんが、必要に応じて簡単に追加できます。また、スレッドセーフではありません。