Me preguntaba cuál es la forma más fácil de iterar en un conjunto indefinidamente, es decir, cuando llega al final next();
llama al primer objeto. Asumo que esto no es una función ya predefinida en Java, así que solo estoy buscando la forma más fácil de implementar esto en Java.¿Cómo puedo hacer un iterador que nunca termina?
Respuesta
Hay un método en el excelente Google Collections biblioteca que hace esto:
Set<String> names = ...;
Iterable<String> infinite = Iterables.cycle(names);
(no puedo recomendar la biblioteca de Google Colecciones con fuerza. Es muy difícil. Soy parcial ya que trabajo para Google, pero creo que casi todos los Googler que escriben Java dirían cuán útiles son las colecciones.)
+1 para Iterables.cycle – coobird
Este es un método realmente genial. –
Si está haciendo el iterador, en el siguiente método puede tener una condición if que verifique si hay otro objeto en la lista. Si lo hay, devuelve ese objeto; si no lo hay, vuelve al comienzo de la lista y devuelve ese objeto.
Entiendo que publicó su respuesta antes que la mía, pero como he visto en mi respuesta, eso es lo que básicamente estoy haciendo ahora, me preguntaba si había una mejor manera que crear un nuevo objeto Iterator cada vez que llego al final –
Esto es lo que se me ocurre ...
iterator = set.getIterator
//other code
if (iterator.hasNext())
//do code here
else
iterator = set.getIterator();
Eso también parece estar bien –
Iterator it = mylist.iterator();
while (it.hasNext())
{
MyType t = (MyType)it.next();
// do something
if (!it.hasNext())
it = mylist.iterator();
}
¿No es esto un ciclo infinito? –
No, .next avanza el iterador. – AlexC
Ya, pero en la parte inferior, reemplace 'it' con un nuevo iterador si' it' está agotado, lo que significa que nunca saldrá del ciclo while ... lo que supongo que es el punto, pero leí mal pregunta y pensó que el OP estaba preguntando cómo * crear * un iterador que itera infinitamente, lo que no funciona –
Creo que lo que no quieren ayuda Usted puede hacer cualquier cosa con su iterador que es fácil pero hay que tener cuidado con cualquier cosa nueva se agrega im no se utiliza con este estilo, pero esto es lo que quiere sin embargo:
si (! It.hasNext()) { while (It.hasPrevious()) { It = It.Previous(); } } else { It = It.Next(); }
De esta manera no es nada si realmente le interesa, en su lugar, debe hacer el siguiente puntero del último al primero siempre al presionar una nueva lista.
¿Qué tal?
List<String> list = // ArraysList
Interator<String> it = null;
while(true) {
it = list.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
}
Si no desea utilizar la guayaba, pero todavía quiere una solución reutilizable:
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 no es compatible con el método remove() pero podría ser fácilmente añadidos si es necesario . Además, no es seguro para subprocesos.
Trate de EndlessIterator
Cactoos:
Iterator<String> names = new EndlessIterator<>("John");
Siempre volverá "John"
y nunca va a terminar.
Además, verifique EndlessIterable
, que implementa Iterable
y hace lo mismo.
- 1. Boost ASIO: SSL handshake() nunca termina
- 2. ¿Por qué este ciclo nunca termina?
- 3. Hacer que un iterador de python vaya hacia atrás?
- 4. PSExec nunca termina cuando se ejecuta dentro de start-job
- 5. ¿Por qué el subproceso iniciado por ScheduledExecutorService.schedule() nunca termina?
- 6. esperar hasta que un proceso termina
- 7. vc80.pdb - ¿Cómo puedo hacer que desaparezca y nunca más volver a molestarme?
- 8. ¿Cómo podría hacer mi propio iterador perezoso?
- 9. ¿Cómo puedo probar el código que nunca se debe ejecutar?
- 10. ¿Cómo usar un iterador?
- 11. ¿Cómo puede un cambio pequeño en un código que nunca se ejecuta hacer la diferencia?
- 12. ¿Cómo firmar un contenedor para que nunca caduque?
- 13. En caso de que un objeto implemente un iterador u otro objeto que implemente un iterador
- 14. Cómo clonar un iterador?
- 15. ¿Cómo puedo iterar sobre un conjunto/HashSet sin un iterador?
- 16. ¿Cómo puedo usar Html.DisplayFor dentro de un iterador?
- 17. Cómo restringir un iterador a ser un iterador directo?
- 18. ¿Por qué no puedo convertir un iterador inverso en un iterador directo?
- 19. ¿Cómo puedo hacer que un TextView parezca un botón?
- 20. ¿Cómo puedo hacer que un hipervínculo funcione en un RichTextBox?
- 21. ¿Cómo puedo depurar un proceso win32 que inesperadamente termina en silencio?
- 22. Mockito: cómo verificar que nunca se invocó un simulacro
- 23. ¿Cómo puedo escribir un contenedor de iteradores que combine grupos de valores secuenciales del iterador subyacente?
- 24. ¿Puedo incrementar un iterador simplemente agregando un número?
- 25. ¿Puedo hacer que un TTreeNode sea invisible?
- 26. ¿Cómo incrementar un iterador en 2?
- 27. ¿Cómo puedo usar OCMock para verificar que nunca se llame a un método?
- 28. ¿Cómo puedo demostrar que un método nunca devolverá nulo (diseño por contrato) en C#
- 29. ¿Cómo puedo hacer que mi dispositivo vibre?
- 30. ¿Cómo puedo hacer que este código Pythonic
¿Qué podría ser un requisito para esto? Si solo quieres repetir algunos elementos para siempre, ¿por qué usar Iterator? – Khangharoth
Si solo estuviera usando el iterador para acceder a los objetos a través de un ciclo while, entonces no tendría sentido, pero no lo estoy, así que utilizo un iterador ya que es lo mejor para lo que quiero hacer. –