2009-06-19 3 views
7

세트를 무한정 반복하는 가장 쉬운 방법은 궁금합니다. 즉, 끝에 도달하면 next();은 첫 번째 객체를 호출합니다. 나는 이것이 자바에서 미리 정의 된 함수가 아니라는 가정하에, 자바에서 이것을 구현하는 가장 쉬운 방법을 찾고있다.끝내지 않는 반복자는 어떻게 만들 수 있습니까?

+0

this에 대한 요구 사항이 될 수 있습니다. 반복적으로 요소를 반복하려면 Iterator를 사용해야하는 이유는 무엇입니까? – Khangharoth

+0

반복기를 사용하여 while 루프를 통해 객체에 액세스하는 경우에는 아무런 문제가 없지만 반복기를 사용하므로 원하는 작업에 가장 적합합니다. –

답변

31

이것은 내가 생각할 수있는 것입니다

+0

+1 for Iterables.cycle – coobird

+0

이것은 정말 멋진 방법이다. –

1

반복자를 만드는 경우 다음 방법에서는 목록에 다른 객체가 있는지 확인하는 if 조건을 사용할 수 있습니다. 존재하는 경우, 그 객체를 돌려줍니다. 그 객체가없는 경우,리스트의 선두에 돌아가 그 객체를 돌려줍니다.

Set<String> names = ...; 
Iterable<String> infinite = Iterables.cycle(names); 

(필자는 구글 컬렉션 라이브러리를 추천 할 수 없습니다 :이 수행하는 우수한 Google Collections 라이브러리의 방법있다

iterator = set.getIterator 
//other code 
if (iterator.hasNext()) 
    //do code here 
else 
    iterator = set.getIterator(); 
+0

당신이 내 대답을 게시했음을 이해합니다. 그러나 기본적으로 내 답변에서 볼 수 있듯이, 내가 끝까지 갈 때마다 새로운 Iterator 객체를 인스턴스화하는 것보다 더 좋은 방법이 있는지 궁금합니다. –

0

... 매우 강력합니다 .Google에서 일하면서 편견을 느낍니다. 자바를 쓰는 모든 Google 직원이 컬렉션이 얼마나 유용한 지 알려줄 것입니다.

+1

그것도 괜찮아 보인다. –

5
Iterator it = mylist.iterator(); 
while (it.hasNext()) 
{ 
    MyType t = (MyType)it.next(); 

    // do something 

    if (!it.hasNext()) 
    it = mylist.iterator(); 
} 
+0

무한 루프가 아닙니까? –

+0

아니요. 다음 반복자가 진행됩니다. – AlexC

+0

그래, 아래쪽에, it it을 새로운 iterator로 대체하면, it가 exausted되면, while 루프에서 빠져 나올 수 없다는 것을 의미한다 ... 나는 모든 점을 추측한다. OP는 반복적으로 루프하는 iterator를 만드는 방법을 묻고있다. –

0

은 당신이 당신은 쉽게 당신의 반복자에 아무것도 할 수 있습니다 도움이되지 않습니다 싶지만 당신이 스타일을 사용하지 않는 메신저를 추가 한 새로운 것으로, 자르해야 어떻게 생각하지만, 이것은 당신이 비록 원하는 것입니다 :

경우 (! It.hasNext()) { while (It.hasPrevious()) { It = It.Previous(); } } else { It = It.Next(); }

새로운 목록을 올릴 때 항상 다음 포인터를 첫 번째 포인터로 지정해야한다면이 방법은 아무런 의미가 없습니다.

0

어때요? 당신은

List<String> list = // ArraysList 
Interator<String> it = null; 

while(true) { 
it = list.iterator(); 
while(it.hasNext()) { 
    System.out.println(it.next()); 
} 
} 
0

구아바를 사용하고 싶지만 아직 재사용 가능한 솔루션을 원하지 않는 경우 :

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(); 
    } 
} 

참고 :이 제거() 메소드를 지원하지 않습니다하지만 필요한 경우 쉽게 추가 할 수 . 또한 스레드로부터 안전하지도 않습니다.

1

Cactoos에서 EndlessIterator을 시도해보십시오

Iterator<String> names = new EndlessIterator<>("John"); 

항상 "John"을 반환하고 끝이 없을 것입니다.

또한 Iterable을 구현하는 EndlessIterable을 확인하십시오.