어떻게 만들 수 있습니 반복기는 끝나지 않?
문제
나는 그냥 무엇인지 궁금하는 가장 쉬운 방법에 대해 반복하는 설정 무기한,즉그것은 끝에 도달하면 그것은 next();
전화 번체입니다.나는 가정이 없는 이미 미리 정의된 기능을 자바에서,그래서 그를 구현하는 가장 쉬운 방법이 있습니다.
해결책
있는 방법에 훌륭한 Google 컬렉션 라이브러리는 이것:
Set<String> names = ...;
Iterable<String> infinite = Iterables.cycle(names);
(나는 추천할 수 없 Google 컬렉션 라이브러리는 강하게 충분합니다.그것은 바위에 매우 어렵습니다.나는 편견으로 나는 일에 대한 구글,하지만 난 거의 모든 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");
그것은 항상 반환합니다 "John"
고 끝이 없을 것입니다.
또한,체크 EndlessIterable
, 를 구현하는 Iterable
과 같은 작업을 수행합니다.
당신이 만드는 경우 반복기,에서 다음 방법을 사용할 수 있는 경우에 확인하는 조건이 있는 경우 다른 개체로 목록에 있습니다.가 있으면,다음 당신이 돌아가는 개체 없는 경우에,당신은 다시 시작으로 이동의 목록을 반환하는 개체입니다.
이것은 무엇을 생각할 수 있는...
iterator = set.getIterator
//other code
if (iterator.hasNext())
//do code here
else
iterator = set.getIterator();
나는 생각이 무엇을 원하지 않는 데 도움 당신은 아무것도 할 수 있으로 반복기는 쉽지만해야 합니다 주로 어떤 새로운 것을 추가하지 사용이 스타일 하지만 이것은 당신이 무엇을 원하는:
if(!니다.hasNext()) { 동(니다.hasPrevious()) { 그것은=니다.이전();} }else{ 그것은=니다.다음();}
이 방법은 아무것도면 정말 당신이 관심이 있으면 다음 포인터의 마지막을 항상 첫번째 경우를 밀어 새로운 목록입니다.
는 방법에 대해?
List<String> list = // ArraysList
Interator<String> it = null;
while(true) {
it = list.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
}
원하지 않는 경우에 사용하는 구아바지만 여전히 원하고 재사용할 수 있는 솔루션:
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()메소드 그러나 그것을 쉽게 추가할 수 있게 필요한 경우.또한 그것은 스레드에 안전합니다.