세트를 무한정 반복하는 가장 쉬운 방법은 궁금합니다. 즉, 끝에 도달하면 next();
은 첫 번째 객체를 호출합니다. 나는 이것이 자바에서 미리 정의 된 함수가 아니라는 가정하에, 자바에서 이것을 구현하는 가장 쉬운 방법을 찾고있다.끝내지 않는 반복자는 어떻게 만들 수 있습니까?
답변
반복자를 만드는 경우 다음 방법에서는 목록에 다른 객체가 있는지 확인하는 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();
당신이 내 대답을 게시했음을 이해합니다. 그러나 기본적으로 내 답변에서 볼 수 있듯이, 내가 끝까지 갈 때마다 새로운 Iterator 객체를 인스턴스화하는 것보다 더 좋은 방법이 있는지 궁금합니다. –
... 매우 강력합니다 .Google에서 일하면서 편견을 느낍니다. 자바를 쓰는 모든 Google 직원이 컬렉션이 얼마나 유용한 지 알려줄 것입니다.
그것도 괜찮아 보인다. –
Iterator it = mylist.iterator();
while (it.hasNext())
{
MyType t = (MyType)it.next();
// do something
if (!it.hasNext())
it = mylist.iterator();
}
무한 루프가 아닙니까? –
아니요. 다음 반복자가 진행됩니다. – AlexC
그래, 아래쪽에, it it을 새로운 iterator로 대체하면, it가 exausted되면, while 루프에서 빠져 나올 수 없다는 것을 의미한다 ... 나는 모든 점을 추측한다. OP는 반복적으로 루프하는 iterator를 만드는 방법을 묻고있다. –
은 당신이 당신은 쉽게 당신의 반복자에 아무것도 할 수 있습니다 도움이되지 않습니다 싶지만 당신이 스타일을 사용하지 않는 메신저를 추가 한 새로운 것으로, 자르해야 어떻게 생각하지만, 이것은 당신이 비록 원하는 것입니다 :
경우 (! 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());
}
}
구아바를 사용하고 싶지만 아직 재사용 가능한 솔루션을 원하지 않는 경우 :
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();
}
}
참고 :이 제거() 메소드를 지원하지 않습니다하지만 필요한 경우 쉽게 추가 할 수 . 또한 스레드로부터 안전하지도 않습니다.
는 Cactoos에서 EndlessIterator
을 시도해보십시오
Iterator<String> names = new EndlessIterator<>("John");
항상 "John"
을 반환하고 끝이 없을 것입니다.
또한 Iterable
을 구현하는 EndlessIterable
을 확인하십시오.
this에 대한 요구 사항이 될 수 있습니다. 반복적으로 요소를 반복하려면 Iterator를 사용해야하는 이유는 무엇입니까? – Khangharoth
반복기를 사용하여 while 루프를 통해 객체에 액세스하는 경우에는 아무런 문제가 없지만 반복기를 사용하므로 원하는 작업에 가장 적합합니다. –