2012-08-07 10 views
5

Como dice el título, estoy buscando una colección de Java que mantenga solo los N últimos objetos insertados en la colección. Esta colección FIFO no necesita implementar acceso aleatorio o soporte para cambiar N.Colección de Java que mantiene solo n últimos miembros insertados

Todas las colecciones que puedo encontrar son de bloqueo (LinkedBlockingQueue) o de tamaño ilimitado (ArrayDeque). Encontré org.eclipse.jetty.util.ArrayQueue, pero como se puede adivinar, esto genera una dependencia no deseada de mi proyecto y también es muy complicado, ya que admite el cambio de N, por lo que no es lo que necesito.

¿Sabes si hay una manera de tener eso con una biblioteca Java bastante común o tengo que escribirla yo mismo?

+3

Mira esto: http://stackoverflow.com/questions/7266042/java-ring-buffer – theglauber

+0

¿Qué quieres que pase con los elementos 'caducados'? –

+0

Ver la respuesta a esta pregunta: http://stackoverflow.com/questions/422181/how-do-i-limit-the-number-of-entries-in-a-java-hashtable – YMomb

Respuesta

6

Salida Apache Commons CircularFifoBuffer

CircularFifoBuffer es una primicia en primer tampón con un tamaño fijo que sustituye a su elemento más antiguo si está lleno.

La orden de eliminación de un CircularFifoBuffer se basa en el pedido de inserción ; los elementos se eliminan en el mismo orden en que se agregaron . El orden de iteración es el mismo que el orden de eliminación.

+1

Hmmm - que se parece a Sin embargo, no le permitirá agregar elementos cuando está lleno, lo cual no es lo que quiere OP. –

+0

@SamMussmann - Whoops. Estaba pensando en el CircularFifoBuffer. Ahora corregido –

2

Escribo una clase contenedora que contiene una instancia privada Queue o Deque y un método de inserción público que se comporta como es necesario si la cola ya está llena cuando el cliente intenta insertar un miembro adicional. El tamaño se puede pasar a través del constructor, y cualquier método perteneciente a Queue o Deque que necesite disponible pero que ya se comporte como lo necesita, puede simplemente reenviarlo a la instancia privada.

1

Después de Guava 15.0 hay EvictingQueue que viene con un tamaño fijo que reemplaza su elemento más antiguo si está lleno.

Cuestiones relacionadas