Pergunta

Eu só estava me perguntando o que a maneira mais fácil de interagir sobre um conjunto indefinidamente, ou seja, quando chega ao final, next(); chamadas o primeiro objeto. Estou assumindo que esta não é uma função já pré-definido em Java, então, basta olhar para a maneira mais fácil de implementar isso em Java.

Foi útil?

Solução

Há um método no excelente biblioteca do Google Collections que faz isso:

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

(Eu não posso recomendar a biblioteca do Google coleções fortemente o suficiente. Ela balança muito difícil. Estou tendenciosa como eu trabalho para o Google, mas eu acho que praticamente todos os Googler escrever Java iria dizer-lhe quão úteis as coleções são.)

Outras dicas

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

  // do something

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

Tente EndlessIterator de Cactoos :

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

Será sempre voltar "John" e nunca vai acabar.

Além disso, verifique EndlessIterable , que implementa Iterable e faz o mesmo.

Se você estiver fazendo o iterador, no próximo método que você pode ter uma condição se que verifica se há um outro objeto na lista. Se houver, então você retorna esse objeto, se não houver, então você voltar para o início da lista e retornar esse objeto.

Isto é o que eu posso pensar ...

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

Eu acho que você nunca quer ajudar Você pode fazer qualquer coisa com seu iterador que é fácil, mas você deve ser cuidado com qualquer coisa nova que você adicionar im não usado com este estilo, mas isso é o que você quer que:

if (! It.hasNext ()) { enquanto (It.hasPrevious ()) { It = It.Previous (); } } outro { It = It.Next (); }

Desta forma, não é nada se o seu realmente interessado você deveria fazer ao lado do ponteiro da última para a primeira sempre quando empurrar uma nova lista.

Que tal?

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

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

Se você não quiser usar goiaba, mas ainda quer uma solução reutilizável:

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

Nota: este não suporta o método remove (), mas poderia ser facilmente adicionados, se necessário. Também não é thread-safe.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top