2014-07-31 4 views
5

Я ищу класс Java, который реализует Collection и теряет самые старые элементы, когда я add() новый, если общее количество элементов больше X. Существует ли оно или у меня есть реализовать его сам?Коллекция, которая теряет самые старые элементы в add()

Мне нужен потокобезопасный.

+1

Возможный дубликат [Java-Ring Buffer] (http://stackoverflow.com/questions/7266042/java-ring-buffer) – DavidPostill

+1

Возможный дубликат [Ограниченная по размеру очередь, содержащая последние N элементов в Java] (http : //stackoverflow.com/questions/5498865/size-limited-queue-that-holds-last-n-elements-in-java) –

+0

Возможный дубликат [Thread-safe circle buffer in Java] (http: // stackoverflow .com/questions/11079210/thread-safe-circle-buffer-in-java) – DavidPostill

ответ

4

Помимо Linkedhasmap, если вы ищете решение типа списка, у Google guava есть EvictingQueue. И для обеспечения безопасности потока вы должны обернуть его в синхронизированную упаковку (Queues#synchronizedQueue).

EvictingQueue<String> q = EvictingQueue.create(3); 
Queue<String> syncQ = Queues.synchronizedQueue(q); 
syncQ.add("one"); 
syncQ.add("two"); 
syncQ.add("three"); 
syncQ.add("four"); 
System.out.println(q); // Prints [two, three, four] 
+0

это not thread safe :( – yegor256

+0

Я думаю, вы могли бы добиться этого путем 'Queues.synchronizedQueue (q);' снова из guava. –

+0

http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common /collect/Queues.html#synchronizedQueue (java.util.Queue) –

2

CircularFifoQueue является первым в первой из очереди с фиксированным размером, который заменяет его
старейшую элемент, если она полна.

2

Вы можете использовать LinkedHashMap сделать именно это, со ссылкой на Javadoc:

// Sample use: this override will allow the map to grow up to 100 entries and then delete the 
// eldest entry each time a new entry is added, maintaining a steady state of 100 entries. 

private static final int MAX_ENTRIES = 100; 

protected boolean removeEldestEntry(Map.Entry eldest) { 
    return size() > MAX_ENTRIES; 
} 

для Потокобезопасного-Несса вы можете обернуть его с помощью Collections.synchronizedmap().

0

Я использовал EvictingQueue добавил в V.15 в Google гуавы реализовать Moving Average функциональность в прошлом.

Это не поточно-безопасный, хотя.

Смежные вопросы