¿Cuál es el mejor enfoque para tener algún tipo de iterador perezoso donde el retorno se evalúa solo a pedido?

StackOverflow https://stackoverflow.com/questions/1632396

  •  06-07-2019
  •  | 
  •  

Pregunta

import java.util.Collection;

import example.Event;

public interface Query
{
    public boolean hasMore ();

    public Collection<Event> getNext ( long count ) throws Exception;
}

Esta es la interfaz que tengo, que quiero implementar.

Se supone que la implementación es así:

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;

import example.Event;
import example.Query;

public class ListQuery implements Query {

    public ListQuery(List<Event> events, String filter)
            throws FilterParseException {
        // events is the list of given events
        // filter is a string representation of the filter to apply
    }

    public Collection<Event> getNext(long count) throws Exception {
         // returns max. count next entries which match given filter
    }

    public boolean hasMore() {
        // returns if there are more elements matching the given filter
    }
}

En lo que estoy pensando es en la relación entre hasMore () y getNext (). En ambos casos tengo que evaluar si el filtro coincide con un elemento de la lista. Posiblemente no conozco la implementación de la lista dada, por lo que podría ser una operación costosa. Obviamente no puedo usar hasNext () de un iterador, porque tengo que verificar si el evento coincide con los criterios dados. En mi implementación actual, tengo dos iteradores diferentes y la posición actual, donde el de hasMore () se mueve hacia arriba si la posición del iterador para getNext () es mayor que la de hasMore ().

Lo que realmente me gustaría hacer es clonar el iterador actual que a su vez usaría para hasMore (), pero esto obviamente no es posible.

¿Existe una solución más elegante para este problema?

¿Fue útil?

Solución

En su implementación getNext , después de asignar su valor de retorno, puede avanzar su iterador hasta que encuentre un evento apropiado. De esta manera, su hasMore puede probar con seguridad hasNext en su iterador para determinar si devuelve true o false .

Otros consejos

Deja de torturarte :-) y solo usa esto:

Iterables.filter (Iterable, Predicate)

Se ocupa de estos problemas por usted.

Si no tiene sus datos en algo Iterable, solo un Iterator, vea los Iteradores de clase correspondientes. Si necesita implementar el Iterator usted mismo, puede ser útil extender AbstractIterator en ese mismo paquete.

Entonces, si realmente desea poder recuperar fragmentos de resultados, puede usar el método de partición () de las clases de Itera * s.

Estoy pensando que ni siquiera necesitas dos iteradores. La llamada hasMore puede iterar hasta encontrar una coincidencia y permanecer allí (si el elemento que ya señala coincide, no iterar). Ahora getNext usará el mismo iterador para iterar y completar la colección de devolución hasta que se alcance el recuento o no se encuentren más elementos coincidentes.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top